10

リモートディレクトリを作成して、そこにファイルを書き込もうとしています。ときどき、ファイルを書き込もうとしているときに、アプリケーションがSystem.IO.DirectoryNotFoundExceptionで失敗することがあります。

ファイルを作成するとき、返されたDirectoryInfoオブジェクトを使用してファイルパスを作成しているため、アプリケーションはディレクトリが作成されたと見なしているようです。ただし、ディレクトリは存在しません。

Windowsがディレクトリの作成を完了する前に、ディレクトリに書き込もうとしている可能性はありますか?Directory.CreateDirectoryは、このタスクが終了するまで戻らないと思います。

4

3 に答える 3

8

回答-はい。ファイル/ディレクトリの作成が遅れている場合の動作が予想されます。他のコメンターによって提案された通常の解決策は、タイムアウトを伴う再試行を使用することです。動作は、使用されるファイル関数(Findfirst、CreateFile、WaitForSingleObjectなど)と同じです。

別の解決策は、Vista以降のWindowsOSにあるAPIの新しいトランザクション関数を使用することです。

この問題は厄介で、DOS / CMDスクリプト、SVNクライアント、Cygwin、perl、さまざまなJavaアプリケーション、さまざまなインストーラーなど、他のプラットフォームで作成され、Windowsに移行されたファイル集約型プロジェクトの開発者には理解されませんでした。

于 2010-02-08T23:39:16.493 に答える
6

私はちょうどこの問題を抱えていました、そして私にとって状況はこのようでした:

if(!exportDirectory.Exists)
    exportDirectory.Create();

その後、同じDirectoryInfoオブジェクトが渡された別のクラスで、次のことを行います。

if (!exportDirectory.Exists)
    throw new DirectoryNotFoundException(exportDirectory.FullName);

そして、ディレクトリは明らかにまだ存在していません(ただし、親ディレクトリはWindowsで開いており、もちろん目の前で見ることができます)。

私が見つけた解決策は、呼び出す必要のあるディレクトリを最初に作成した後です。

exportDirectory.Refresh();

Microsoftから:

オブジェクトの状態を更新します。(FileSystemInfoから継承されます。)

于 2015-02-06T20:53:13.930 に答える
4

私はこの動作を経験したことがなく、説明することもできませんが、実用的な解決策は、ディレクトリにアクセスする呼び出しの周りにループを設定することです。そのループ内でDirectoryNotFoundExceptionをキャッチし、毎回少し休止した後、アクセスを数回再試行します。再試行回数を超えた場合は、例外を再スローします。

この時点で詳細なログを追加すると、問題の実際の原因を特定するのに役立つ場合があります。

于 2010-02-08T23:21:30.093 に答える