基于流的文件 IO

打开一个流

fopen 打开一个文件流句柄,可以使用各种函数进行读取,写入,搜索和其他功能。此值为 resource 类型,不能传递给其他持久保留其功能的线程。

$f = fopen("errors.log", "a"); // Will try to open errors.log for writing

第二个参数是文件流的模式:

模式 描述
r 从只读模式打开,从文件开头开始
r+ 从文件的开头开始进行读写
w 从文件的开头开始只写。如果该文件存在,它将清空该文件。如果它不存在,它将尝试创建它。
w+ 从文件的开头开始进行读写。如果该文件存在,它将清空该文件。如果它不存在,它将尝试创建它。
a 从文件末尾开始,只打开一个文件进行写入。如果该文件不存在,它将尝试创建它
a+ 从文件末尾开始打开文件进行读写。如果该文件不存在,它将尝试创建它
x 创建并打开一个仅供写入的文件。如果该文件存在,则 fopen 调用将失败
x+ 创建并打开一个文件进行读写。如果该文件存在,则 fopen 调用将失败
c 打开文件只写。如果该文件不存在,它将尝试创建它。它将在文件开头写入,但在写入之前不会清空文件
c+ 打开文件进行读写。如果该文件不存在,它将尝试创建它。它将在文件开头写入,但在写入之前不会清空文件

在 Windows 中添加 t(例如 a+bwt 等)将在处理文件时将 \n 行结尾转换为 \r\n。如果不是这样的话,在模式后添加 b,特别是如果它是二进制文件。

当 PHP 应用程序不再用于防止 Too many open files 错误时,应该使用 fclose 关闭流。这在 CLI 程序中尤其重要,因为只有在运行时关闭时才关闭流 - 这意味着在 Web 服务器中,可能没有必要** (但仍然应该,作为防止资源泄漏的做法)关闭流如果你不希望这个进程运行很长时间,并且不会打开很多流。

使用 fread 将从文件指针读取给定的字节数,或者直到满足 EOF。

阅读线

使用 fgets 将读取文件,直到达到 EOL 或读取给定长度。

无论 freadfgets 在阅读将移动文件指针。

读剩下的一切

使用 stream_get_contents 将流中的所有剩余字节转换为字符串并返回它。

调整文件指针位置

最初在打开流之后,文件指针位于文件的开头(或者如果使用模式 a 则结束)。使用 fseek 函数将文件指针移动到相对于三个值之一的新位置:

  • SEEK_SET:这是默认值; 文件位置偏移量将相对于文件的开头。
  • SEEK_CUR:文件位置偏移量将相对于当前位置。
  • SEEK_END:文件位置偏移量将相对于文件末尾。传递负偏移量是该值的最常见用途; 它会在文件结束前将文件位置移动到指定的字节数。

rewindfseek($fh, 0, SEEK_SET) 的便捷捷径。

使用 ftell 将显示文件指针的绝对位置。

例如,以下脚本读取跳过前 10 个字节,读取下 10 个字节,跳过 10 个字节,读取接下来的 10 个字节,然后读取 file.txt 中的最后 10 个字节:

$fh = fopen("file.txt", "rb");
fseek($fh, 10); // start at offset 10
echo fread($fh, 10); // reads 10 bytes
fseek($fh, 10, SEEK_CUR); // skip 10 bytes
echo fread($fh, 10); // read 10 bytes
fseek($fh, -10, SEEK_END); // skip to 10 bytes before EOF
echo fread($fh, 10); // read 10 bytes
fclose($fh);

写作

使用 fwrite 将提供的字符串写入从当前文件指针开始的文件。

fwrite($fh, "Some text here\n");