-1

ディレクトリ内のすべてのファイルをチェックし、リストをコンソールに書き込む機能があります。問題は、現在ディレクトリにコピーされているファイルを含めたくないということです。完了したファイルのみを表示したいのです。それ、どうやったら出来るの?これが私のコードです:

foreach (string file in Directory.EnumerateFiles("C:\folder"))
        {
            Console.WriteLine(file);
        }
4

3 に答える 3

3

「コピーされている」と「何かによって書き込みのためにロックされている」を区別する方法は本当にありません。関連:ファイルのロックを確認するには? 使用中のファイルを単に「読み取る」ことはできますか?

書き込み用に開いていないファイルのリストを単に表示したい場合は、それらを開こうとすることで実行できます。

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% 存在します。ファイルが部分的に存在している間、「読み取り」プロセスがファイルを参照する機会はありません。

ファイル システム間で移動を行うと、コピーと同じように動作することに注意してください。

于 2013-07-19T21:12:05.827 に答える
1

Windows / .NET /その他のどこにも保存されている「現在コピーされているファイル」リストはありません。おそらく、できることは、追加するために各ファイルを開いて、例外が発生するかどうかを確認することです。ディレクトリのサイズと場所、およびセキュリティ設定によっては、それがオプションではない場合があります。

于 2013-07-19T20:59:06.590 に答える
1

これを行うためのきれいな方法はありませんが、これは...うまくいきます...

foreach (var file in new DirectoryInfo(@"C:\Folder").GetFiles())
{
    try
    {
        file.OpenRead();
    }
    catch
    {
        continue;
    }
    Console.WriteLine(file.Name);
}
于 2013-07-19T21:01:21.423 に答える