当Windows资源管理器中打开已删除的目录时,PHP函数'scandir'显示已删除的目录

时间:2012-10-25 22:23:04

标签: php

我在使用PHP 5.4.4的Windows Server 2008 R2计算机上运行Apache HTTP Server 2.4。

我的E:\驱动器上有以下目录结构:

E:\Dir1\Dir2\Dir3

除了上面显示的子目录外,所有目录(Dir1Dir2Dir3)都是空的(它们没有文件)。

我正在尝试删除Dir3,然后查看目录Dir2的内容,以确保其中没有任何内容。我编写了以下PHP脚本来测试它:

<?php

    $currentDir = "E:\\Dir1\\Dir2\\Dir3";

    $parentDir = dirname( $currentDir );  // Get the parent directory for Dir3.

    rmdir ( $currentDir );  // Remove directory Dir3.

    echo "<b>Current directory:</b> " . $currentDir . " <b><< I don't exist, I was just deleted.</b><br />";
    echo "<b>Parent directory:</b> " . $parentDir. "<br />";

    echo "<b>According to 'scandir', the parent directory contains:</b> ";
    print_r( scandir( $parentDir, SCANDIR_SORT_NONE ) );
    echo "<br /><br />";

?>

如果我在Windows资源管理器中打开Dir3,则上面的脚本会完美地完成并提供以下输出:

  

当前目录: E:\ Dir1 \ Dir2 \ Dir3 &lt;&lt;我不存在,我刚被删除。

     

父目录: E:\ Dir1 \ Dir2

     

根据&#39; scandir&#39;,父目录包含:数组([0] =&gt;。[1] =&gt; ..)

但是,如果我在Windows资源管理器中打开Dir3,我会得到以下输出:

  

当前目录: E:\ Dir1 \ Dir2 \ Dir3 &lt;&lt;我不存在,我刚被删除。

     

父目录: E:\ Dir1 \ Dir2

     

根据&#39; scandir&#39;,父目录内容:数组([0] =&gt;。[1] =&gt; .. [2] =&gt; Dir3 )

请注意,Dir3出现在Dir2的内容数组中。换句话说,scandir()认为Dir3仍然存在,即使我知道事实并非如此(Windows资源管理器将我踢回Dir2)。

有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:3)

在Windows资源管理器中打开目录时。 handle中的directory存在OS-es memoryScandir在内部从OS获取目录/文件存在的详细信息。因此,当目录打开并删除它并立即运行scandir时,Windows会返回它,因为目录句柄上有"lock"。只有在关闭目录时才会关闭此句柄(或者我猜测某些内部垃圾收集发生在操作系统级别)。当目录未在Windows资源管理器中打开时,这些边缘情况都不会发生,所以一切都像魅力一样。

再一次是windows的行为。我认为clearstatcache()是一个选项,但我认为它仅适用于posix-compliant Os-es,scandir()也不受其影响。