2009-08-22 7 views
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." 
} 

:ファイルがまだに書き込まれているか、使用する際に考慮されている場合たとえば、このコードブロックは、例外がスローされます試しにキャッチしてポーリングすると、だから hackyと感じます。私はそこに何かがあることを期待していますSystem.IO.FileInfoがありません。

もっと良いアイデアはありますか?

答えて

4

「あなたがたFileStream上SafeFileHandleプロパティによって返されたハンドルを使用します。/ Pを通じてロックファイルAPI関数を呼び出して直接層を呼び出すことができます。 をAPIを呼び出し、直接あなたが戻り値をチェックすることができます例外を捕まえることに頼るのではなく、エラー状態になる」

"try/catchブロックが正解(あなたはすべての例外は、IOExceptionをしませキャッチしたいが)である。あなたが適切に同期させることができる方法はありません、ロックのテスト+ロックを取得することはできませんので、原子操作。

は覚えておいて、ファイルシステムは揮発性である:あなたのファイルは一つの操作のために1つの状態にあるという理由だけで、それは次の操作のために同じ状態になるという意味ではありませんあなたのことができるようにする必要があります。ファイルシステムから例外を処理します。 "しようとするだろうと、それは単にループでキャッチをしようとするだろうかまあ

Using C# is it possible to test if a lock is held on a file

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

+0

私はそれが原子であることを心配していません。そのリンクは、P/Invoke経由でチェックできることについて話しました。それがどこに役立つのかを知るための情報はどこにありますか? – mckamey

+0

@McKAMEY:追加したばかりの2番目のリンクを確認してください。 – cakeforcerberus

+0

ファイルシステムの変更は常に可能なので、正解はそれを試して、例外が発生した場合に対処することです。さらに、それが使用されているかどうかを調べるために、フープを飛び越えるよりも簡単に求めることは簡単です。 –

0

機能。データベースと同様に、何かできることがあるかどうかを調べる最善の方法は、試してやることです。失敗した場合は、それを処理します。スレッドコードがオフになっていない限り、ユーザーが別のプログラムで開いていない限り、プログラムがファイルを開くことができないようにする必要はありません。

もちろん面白いことをしていない限り、

+0

私は面白いことをやろうとしています:)私の場合、これらは長時間実行されるロックであり、ループでtry-catchの価格を支払ってはいけません。ときどきは問題ありませんが、例外的な状況よりも潜在的に一般的です。 – mckamey

関連する問題