我有以下示例代码
<?php
`echo test > /tmp/test.txt`;
$f=fopen("/tmp/test.txt","w+");
`rm /tmp/test.txt`;
var_dump(fwrite($f,"test"));
fclose($f);
file_get_contents("/tmp/test.txt");
Run Code Online (Sandbox Code Playgroud)
它创建一个文件,打开一个指向它的指针,删除该文件然后尝试写入它.现在我希望fwrite返回false或0,因为不会写入任何数据,但它会产生以下输出
int(4)
Warning: file_get_contents(/tmp/test.txt): failed to open stream: No such file or directory in /Stuff/tmp/test3 on line 7
Run Code Online (Sandbox Code Playgroud)
所以fwrite显然成功但file_get_contents按预期失败.
fwrite的预期行为是否返回要写入的字节数?如果是这样,我如何测试写入是否真的成功?
这是用php 5.3.3
它返回的原因false是文件指针位于文件末尾之后fwrite......这fgets就是它到达文件末尾时应该做的事情(false因为没有更多的数据可以返回)...
您需要做的是在fseek致电之前添加电话fgets:
var_dump(fwrite($f,"test"));
fseek($f, 0);
var_dump(fgets($f));
Run Code Online (Sandbox Code Playgroud)
编辑:现在我理解了你的问题(并且已经看过了):
好吧,所以这就是发生的事情.要理解,您必须首先了解Linux文件系统的工作原理.该文件的名称对操作系统毫无意义.它所做的就是指向INODE文件.inode存储数据等.它还存储对该文件的硬链接数的引用号.只有当引用号变为0时才会删除该文件.我怀疑打开指向该文件的指针(使用fopen或其他系统调用)会增加引用计数.
所以基本上,这意味着当你运行rm文件时,它删除了硬链接.但由于文件仍处于打开状态,您仍然可以访问inode fwrite(因此写入成功的原因).您无法访问,/tmp/test.txt因为该文件名的硬链接不再存在.因此该文件成为只能由inode访问的幻像文件.但是一旦你关闭了该文件的文件句柄(fclose或者通过结束脚本),引用计数就会降到0并且inode被释放了......
所以文件确实存在,只是在你打电话后无法从文件名访问rm...
通过了解我对文件系统的了解,这就是我收集的内容.我不是说它是100%准确的,但它应该是一个不错的假设......
| 归档时间: |
|
| 查看次数: |
1652 次 |
| 最近记录: |