8

堅牢な再帰フォルダ削除機能を作成しようとしています。

通常のディレクトリではかなりうまく機能します。

次のような「ハードコア」ディレクトリを作成すると、問題が発生します。

C:\ test \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ x \ ... \ x \ x \ x

この長さは約25000です(MSDNの制限である32,767未満)。基本的に、CreatDirectory関数が失敗するまで、このディレクトリを再帰的に作成しました。

さて、最も奇妙なことは、私の関数が2つのディレクトリを削除できることです。その後、FindFirstFileは0x5で失敗します。

\\?\C:\test\x\ ... \x\x\x\*.*    < no error
\\?\C:\test\x\ ... \x\x\*.*      < no error
\\?\C:\test\x\ ... \x\*.*        < access denied

(私はそれを再実行することができます、おそらくパスの長さがかなり短くなるまで、アプリはゆっくりとフォルダーを2 x 2で噛み砕きます)

FindFirstFileを実行して、フォルダーが空かどうかを確認しています。

  • 文書化されていない種類の制限はありますか?
  • FindFirstFileは単に機能しませんか?(バギー?)
  • ある種のNTFSアクセス許可がありませんか?
  • 他の何か..。

編集:重要な注意:プログラムを段階的にゆっくり実行すると...何も失敗しません。

4

1 に答える 1

8

おそらく、ディレクトリへのハンドルを保持しているウイルススキャナー、インデクサー、または継続的なバックアップソリューションのようなものが発生しています。たとえば、インデックスサービスがそのフォルダにインデックスを付けるように構成されている場合。

FILE_SHARE_DELETEフラグ以外で開いているフォルダまたはファイルを削除しようとすると、ACCESS_DENIEDが発生します。

これを確認するには、プロセスモニターを使用して、パスに一致するものの開閉を確認します。

(もちろん、FindCloseを呼び出したことも確認してください)。

于 2012-05-16T20:45:05.403 に答える