2

为什么打开的文件会被删除?在 Windows Xamp 上,我收到消息“仍在工作”,但在其他 PHP serwer 文件上被删除,即使它已打开并且我收到消息“文件已删除”。即使第一个脚本仍在工作,我也可以从 FTP 删除文件:(

<?php
$handle = fopen("resource.txt", "x");
sleep(10);
?>


<?php
if (file_exists("resource.txt") && @unlink("resource.txt") === false) {
    echo "still worning";
    exit;
}
else
    echo "file deleted";
?>
4

1 回答 1

6

UNIX 系统通常允许您这样做,是的。底层 Cunlink函数记录如下:

unlink()函数从其目录中删除由 path 命名的链接,并减少链接引用的文件的链接计数。如果该减量将文件的链接计数减少到零,并且没有进程打开该文件,则与该文件关联的所有资源都将被回收。如果一个或多个进程在删除最后一个链接时打开了文件,则删除链接,但文件的删除会延迟,直到所有对它的引用都已关闭。

换句话说,您基本上可以随时将文件标记为删除,但只要应用程序仍在访问它,系统实际上就会保留它。只有当所有应用程序都放开该文件时,它才会最终真正被删除。Windows 显然不会那样做。更新: 从 PHP 7.3开始,现在可以unlink打开文件了。

附带说明一下,UNIX 的行为是多进程环境中唯一正常的行为。如果在系统允许您删除文件之前必须等待所有进程关闭对文件的访问,则根本不可能删除经常访问的文件。是的,这就是那些关于“无法删除文件,仍在使用,重试?”的 Windows 对话框。来自你永远无法摆脱的地方。

于 2014-04-25T08:33:44.787 回答