基于流的文件 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+b
,wt
等)将在处理文件时将 \n
行结尾转换为 \r\n
。如果不是这样的话,在模式后添加 b
,特别是如果它是二进制文件。
当 PHP 应用程序不再用于防止 Too many open files
错误时,应该使用 fclose
关闭流。这在 CLI 程序中尤其重要,因为只有在运行时关闭时才关闭流 - 这意味着在 Web 服务器中,可能没有必要** (但仍然应该,作为防止资源泄漏的做法)关闭流如果你不希望这个进程运行很长时间,并且不会打开很多流。
读
使用 fread
将从文件指针读取给定的字节数,或者直到满足 EOF。
阅读线
使用 fgets
将读取文件,直到达到 EOL 或读取给定长度。
读剩下的一切
使用 stream_get_contents
将流中的所有剩余字节转换为字符串并返回它。
调整文件指针位置
最初在打开流之后,文件指针位于文件的开头(或者如果使用模式 a
则结束)。使用 fseek
函数将文件指针移动到相对于三个值之一的新位置:
SEEK_SET
:这是默认值; 文件位置偏移量将相对于文件的开头。SEEK_CUR
:文件位置偏移量将相对于当前位置。SEEK_END
:文件位置偏移量将相对于文件末尾。传递负偏移量是该值的最常见用途; 它会在文件结束前将文件位置移动到指定的字节数。
rewind
是 fseek($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");