2011-01-04 8 views
1

私は多くの例を検索しましたが、私にとって完璧なものはありません。私はC#を使用しています。ファイルの検出方法は?

私のアプリケーションでは、ファイルが閉じられているときにのみ、フォルダ内のファイルを削除する必要があります。

のtry-catch File.Open(...)メソッドは、mp3などのdoc、xlsファイル、PPT、PDF、などの特定のファイルタイプのために動作しますが、TXT、郵便番号、HTMLなどには使用できませ

...

+0

が重複する可能性は:チェックする方法はありますファイルが使用されている場合?](http://stackoverflow.com/questions/876473/c-is-there-a-way-to-check-if-a-file-is-in-use) –

答えて

11

あなたの見ている動作は、ファイルの拡張子や内容とは関係ありません。関連するアプリケーションがそれらのファイルを扱う方法と関係しています。たとえば、メモ帳、Internet Explorerなどは、内容を読み込んだ後に開いたファイルをロックしません。そのため、.txtファイルと.htmlファイルを開くことができます。

Microsoft Office、ほぼすべてのメディアプレーヤーなどがファイルをロックします。 Officeの場合は、他のプログラムがそのファイルを削除/移動しないようにするためです。メディアプレーヤーの場合、ファイルは通常、大きすぎてメモリに完全に読み込まれません。そのため、これらのファイルタイプは使用中にロックされます。

つまり、使用されていないと思われるファイルは実際には使用されていません。プログラムはファイルからデータを読み込み、それを閉じて、それで終了します。他のプログラムが特定のファイルを開いているかどうかを判断する簡単な方法はありません。

+0

私はあなたの説明の背後にある論理を理解しています。私が今できることは、タイマーを使って最も古い「Last Access Time」を持つファイルを削除することです。 – VHanded

+0

実際には、最後のアクセス時間が有効になっていないオペレーティングシステムでも動作しません。 Windows XPでは最後のアクセス時間を無効にすることができ、VistaとWindows 7ではデフォルトで無効になります。 – Josh

+0

oh?思い出してくれてありがとう。それを変更します。 – VHanded

0

バイナリモードでファイルを開きます。File.Open(...)はすべてのファイルに対して機能します。

0

書き込みモードでファイルを開いてみてください、私はそのロックが自動的に解除される場合はロックがあなたのスレッドdies..dunno場合は、何らかの理由でexculsive..butされていることを指定するものがあると思い...

0

あなたが必要とするのは、使用されていないファイルを削除することだけです。rigth ... File.Deleteによってスローされた例外を無視してください。それは、使用中のファイルは削除されませんので...

try 
{ 
    File.Delete(path); 
} 
catch(Exception e) 
{ 
// ignore ... or whatever action 
} 

あなたはまた、読み取り専用のファイルとアクセス許可の問題などのために、使用中のファイルのためにUnauthorizedAccessExceptionをのIOExceptionのような特定のアクションを実行するために特定の例外を...キャッチすることができます。 ..

...まだファイルとして例外を通じて確認および削除の操作の間にいくつかのプロセスによって開かれている場合があり、削除しようとし、次に開くためにファイルをチェックし、[C#2の

+1

メモ帳などの特定のアプリケーションではこれは動作しません。これはファイルにロックを適用しません。 – VHanded