14

非常に多くの場合、Windows 7 コンソールで Python プログラムを 2 回実行すると、非常に速く実行されます。

if os.path.isdir(d):
    shutil.rmtree(d)
if not os.path.exists(d):
    os.mkdir(d)

多くのdファイルを含むディレクトリの名前は、コマンドに対して「許可が拒否されました」というメッセージが表示されmkdirます。しかし、一度実行してから数秒待ってから再度実行すると、そのようなエラーは発生しません。ここで何が問題なのですか?

4

1 に答える 1

11

思いつくのは次の3つです。

  1. Windows 自体は、メタデータを保持するために一部のファイル操作を遅らせます。たとえば、ファイルの名前を変更し、その場所に別のファイルを作成する場合、Windows には ACL などのものが新しいファイルに転送されるタイム ウィンドウがあります。これは、途中で何かが失敗したときにデータを失わないようにするために、古いファイルを削除する前に新しいファイルを書き込むプログラムでも、このメタデータを保持するための「機能」です。

  2. マルウェア スキャナーは、ファイル システム操作にフックして、ファイルのスキャンを実行し、マルウェアを検索します (または、妄想的であれば政府の批評家のテキスト、妄想的でない場合でもそうかもしれません)。そのスキャン中、ファイルへの他のアクセスはブロックされます。

  3. 最後に、どのようshutil.rmtree()に実装されているかはわかりませんが、Windows では、一部のツリー操作は実際には OS コアではなくシェル (つまり Explorer) によって実装されており、非同期で実行できます。呼び出しが既に返されていても、パスはブロックされたままです。

たとえば、Subversion または Apache Portable Runtime が同じ問題に遭遇し、単に遅延して再試行するだけで回避できたと思います。このソリューションは美人コンテストで優勝することはありませんが、Do The Job(tm) のようです。

于 2013-05-04T14:15:04.030 に答える