4

読み取り用にファイルを開こうとする前に、ファイルが使用中かどうかを最初にテストする方法はありますか? たとえば、次のコード ブロックは、ファイルがまだ書き込まれている場合、または使用中と見なされる場合に例外をスローします。

try
{
    FileStream stream = new FileStream(fullPath, FileMode.Open, FileAccess.Read, FileShare.Read);
}
catch (IOException ex)
{
    // ex.Message == "The process cannot access the file 'XYZ' because it is being used by another process."
}

私は周りを見回しましたが、私が見つけることができる最良の方法は、try catch を内部に使用して何らかのポーリングを実行することです。何かがオンになっていると思いますがSystem.IO.FileInfo、ありません。

より良い方法に関するアイデアはありますか?

4

2 に答える 2

4

「P/Invoke レイヤーを介して LockFile API 関数を直接呼び出すことができます。FileStream の SafeFileHandle プロパティによって返されたハンドルを使用します。API を直接呼び出すと、エラー状態の戻り値を確認することができます。例外をキャッチします。」

try/catch ブロックは正しい解決策です (ただし、すべての例外ではなく IOException をキャッチする必要があります)。ロックのテスト + ロックの取得はアトミック操作ではないため、適切に同期する方法はありません。」

ファイル システムは揮発性であることを忘れないでください。ファイルが 1 つの操作で 1 つの状態にあるからといって、次の操作でも同じ状態になるとは限りません。ファイル システムからの例外を処理できなければなりません。」

C# を使用して、ファイルがロックされているかどうかをテストできますか?

http://www.dotnet247.com/247reference/msgs/32/162678.aspx

于 2009-08-22T02:36:46.213 に答える
0

それを実行しようとする関数は、単純にループ内で catch を試行します。データベースと同じように、自分にできることがあるかどうかを知る最善の方法は、実際にやってみることです。失敗した場合は、対処してください。スレッドコードがオフになっていない限り、ユーザーが別のプログラムでファイルを開いた場合を除き、プログラムがファイルを開くことができないという理由はありません。

もちろん、面白いことをしている場合を除きます。

于 2009-08-22T02:37:44.357 に答える