为什么在打开的文件上取消链接成功?

时间:2014-04-25 08:28:34

标签: php fopen unlink fclose

为什么打开文件被删除?在Windows Xamp上,我收到消息“仍在工作”,但在其他PHP服务器文件被删除,即使它是打开的,我收到消息“文件已删除”。我也可以从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";
?>

1 个答案:

答案 0 :(得分:4)

UNIX系统通常允许您这样做,是的。基础C unlink函数is documented如下:

  

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

换句话说,您基本上可以标记该文件以供删除,但只要应用程序仍在访问它,系统就会实际保留它。只有当所有应用程序都放弃了文件时,它才会最终被删除。 Windows显然这样做。

作为旁注,UNIX的行为是多进程环境中唯一理智的行为。如果在系统允许您删除文件之前必须等待所有进程关闭对文件的访问权限,则根本不可能删除经常访问的文件。是的,那些关于“无法删除文件,仍在使用中,重试?”的Windows对话框来自哪里,你永远无法摆脱它。