1

我在装有 PHP 5.4.4 的 Windows Server 2008 R2 机器上运行 Apache HTTP 服务器 2.4。

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

E:\Dir1\Dir2\Dir3

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

我正在尝试删除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 << 我不存在,我只是被删除了。

父目录: E:\Dir1\Dir2

根据'scandir',父目录包含: Array ( [0] => . [1] => .. )

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

当前目录: E:\Dir1\Dir2\Dir3 << 我不存在,我只是被删除了。

父目录: E:\Dir1\Dir2

根据'scandir',父目录内容: Array ( [0] => . [1] => .. [2] => Dir3 )

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

有谁知道为什么会这样?

4

1 回答 1

3

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

再次是 Windows 的行为之一。我认为clearstatcache()是一种选择,但我相信它只适用于posix-compliantOs-es 并且scandir()不受它的影响。

于 2012-10-25T22:39:37.807 回答