「コピーされている」と「何かによって書き込みのためにロックされている」を区別する方法は本当にありません。関連:ファイルのロックを確認するには? 使用中のファイルを単に「読み取る」ことはできますか?
書き込み用に開いていないファイルのリストを単に表示したい場合は、それらを開こうとすることで実行できます。
foreach (string file in Directory.EnumerateFiles("C:\folder"))
{
try {
using (var file = file.Open(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) {
Console.WriteLine(file);
}
} catch {
// file is in use
continue;
}
}
ただし、多くの注意事項があります。
- ファイル名 (ブロックの終わり) を表示した直後に
using
、ファイルを別の方法で開くことができます。
- ファイルを書き込むプロセスで FileShare.Read が使用されている可能性があります。これは、ファイルが書き込まれているにもかかわらず、呼び出しが成功することを意味します。
ここで何をしているのか正確にはわかりませんが、キューディレクトリを共有する2つのプロセスのように聞こえます.1つは書き込み、もう1つは読み取り/処理です。最大の課題は、ファイルの書き込みに時間がかかることです。そのため、「読み取り」プロセスは、ファイル全体が存在する前にファイルを取得して読み取ろうとし、共有モード、アプリの方法によっては何らかの形で失敗します。などが書かれています。
この状況に対処する一般的なパターンは、次のようなアトミック ファイル操作を使用することですMove
。
- キュー ディレクトリと同じファイル システム(非常に重要) にある一時ディレクトリに対して (低速の) 書き込み/コピー操作を実行します。
- 完了したら、一時ディレクトリからキュー ディレクトリに移動します。
move はアトミックであるため、ファイルは存在しないか、100% 存在します。ファイルが部分的に存在している間、「読み取り」プロセスがファイルを参照する機会はありません。
ファイル システム間で移動を行うと、コピーと同じように動作することに注意してください。