1

PHP 5.4.4 を搭載した Windows Server 2008 R2 マシンで Apache HTTP サーバー 2.4 を実行しています。

E:\ドライブに次のディレクトリ構造があります。

E:\Dir1\Dir2\Dir3

上記の子ディレクトリを除いて、すべてのディレクトリ ( Dir1Dir2および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 << 存在しません。削除されました。

親ディレクトリ: E:\Dir1\Dir2

「scandir」によると、親ディレクトリには以下が含まれます: Array ( [0] => . [1] => .. )

ただし、Dir3Windows エクスプローラーで開くと、次の出力が得られます。

現在のディレクトリ: E:\Dir1\Dir2\Dir3 << 存在しません。削除されました。

親ディレクトリ: E:\Dir1\Dir2

「scandir」によると、親ディレクトリの内容: Array ( [0] => . [1] => .. [2] => Dir3 )

Dir3の内容の配列に が表示されることに注意してくださいDir2。言い換えれば、存在しないという事実を知っていても、それがまだ存在するscandir()と考えてDir3います (Windows エクスプローラーは私を に戻しますDir2)。

なぜこれが起こっているのか誰にも分かりますか?

4

1 に答える 1

3

Windows エクスプローラーでディレクトリを開いている場合。の に が存在handledirectoryますOS-es memoryScandirOSからディレクトリ/ファイルの存在の詳細を内部的に取得します。したがって、ディレクトリが開いていて、それを削除してすぐに実行すると、ディレクトリハンドルにscandira があるため、Windowsはそれを返します。"lock"このハンドルは、ディレクトリを閉じたときにのみ閉じます (または、OS レベルでいくつかの内部ガベージ コレクションが発生すると思います)。ディレクトリがWindowsエクスプローラーで開かれていない場合、これらのエッジケースは発生していないため、すべてが魅力的に機能します。

これもウィンドウの動作の 1 つです。clearstatcache()オプションだと思いますが、 posix-compliantOs-esでのみ機能しscandir()、影響を受けないと思います。

于 2012-10-25T22:39:37.807 に答える