我在使用PHP 5.4.4的Windows Server 2008 R2计算机上运行Apache HTTP Server 2.4。
我的E:\
驱动器上有以下目录结构:
E:\Dir1\Dir2\Dir3
除了上面显示的子目录外,所有目录(Dir1
,Dir2
和Dir3
)都是空的(它们没有文件)。
我正在尝试删除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
)。
有谁知道为什么会这样?
答案 0 :(得分:3)
在Windows资源管理器中打开目录时。 handle
中的directory
存在OS-es memory
。 Scandir
在内部从OS获取目录/文件存在的详细信息。因此,当目录打开并删除它并立即运行scandir
时,Windows会返回它,因为目录句柄上有"lock"
。只有在关闭目录时才会关闭此句柄(或者我猜测某些内部垃圾收集发生在操作系统级别)。当目录未在Windows资源管理器中打开时,这些边缘情况都不会发生,所以一切都像魅力一样。
再一次是windows的行为。我认为clearstatcache()
是一个选项,但我认为它仅适用于posix-compliant
Os-es,scandir()
也不受其影响。