gpt4 book ai didi

PHP fwrite 总是返回要写入的字节数,即使文件不存在也是如此,这是预期的行为吗?

转载 作者:行者123 更新时间:2023-12-02 07:50:16 25 4
gpt4 key购买 nike

我有以下示例代码

<?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");

它创建一个文件,打开一个指向它的指针,删除该文件然后尝试写入它。现在我希望 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

所以 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));

编辑:现在我理解了您的问题(并查看了它):

好的,这就是发生的事情。要理解,您必须首先了解 Linux 文件系统的工作原理。文件名对操作系统没有意义。它所做的只是指向 INODE。对于文件。 inode存储数据等。它还存储一个引用编号到hard-links的编号。到那个文件。该文件仅在引用编号降至 0 时才被删除。我怀疑打开指向该文件的指针(使用 fopen 或其他系统调用)会增加引用计数。

所以基本上,这意味着当您在文件上运行 rm 时,它会删除硬链接(hard link)。但由于文件仍处于打开状态,您仍然可以通过 fwrite 访问 inode(这就是写入成功的原因)。您无法访问 /tmp/test.txt,因为指向该文件名的硬链接(hard link)已不存在。于是文件就变成了只有inode才能访问的幻影文件。但是一旦您关闭该文件的文件句柄(fclose,或通过结束脚本),引用计数就会降为 0 并且 inode 被释放...

因此该文件确实存在,只是在您调用 rm 后无法从文件名访问它...

这正是我通过了解我对文件系统的了解而收集到的信息。我并不是说它 100% 准确,但它应该是一个不错的假设......

关于PHP fwrite 总是返回要写入的字节数,即使文件不存在也是如此,这是预期的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4215653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com