1

私のアプリケーションはディレクトリをリッスンしており、作成した新しいファイルはそれぞれ処理する必要があるため、テストを行ってフォルダをリッスンし、大きなファイルをこのフォルダに移動すると、ファイル全体が作成される前にイベントが発生することを確認しました。私の問題を引き起こします。すべてのファイルが作成されるまで待つことはできますか?

public void startListener(string directoryPath)
{
    FileSystemWatcher watcher = new FileSystemWatcher(directoryPath);
    watcher.Filter = "*.avi";
    watcher.Created += watcher_Created;
    watcher.EnableRaisingEvents = true;
}

void watcher_Created(object sender, FileSystemEventArgs e)
{

}
4

2 に答える 2

0

MSDN docsによると、ファイルがあるディレクトリから別のディレクトリにコピーされると、複数OnCreate()のイベントが生成される場合があります。OnChanged()

ここで 2 つのケースを区別する必要があります。

  • 自分でファイルをコピーしているので、コピーの方法を制御できます。

    この場合、目的のフォルダーで拡張子のない一時ファイル名を使用するのが最も効率的です (たとえば、の代わりに.avi使用できます) 。filename.avi.tmpfilename.avi.avi

    次に、Renamedイベントをサブスクライブし、名前が に変更されたファイルを監視します.avi

  • コピーを制御できない場合は、この質問に対する別の回答で説明されている手法のいずれかを使用できます

于 2012-12-25T14:56:16.997 に答える
0

あなたができると思うのはOnCreated、「新しく作成された」ファイルをローカルに追加することで、イベントを処理することListです。

次に、OnChangedピースが更新されたときにトリガーされる で、ファイルが新しく作成されたもののリストにあるかどうかを確認し、次のようなことを行って、ファイルを排他的に開こうとします。

File.Open("someFile.avi", FileMode.Open, FileAccess.Read, FileShare.None)

が表示された場合IOException、そのファイルはまだ使用されています。

あなたができる別のことは、Renameイベントを使用して、このコメントで説明されています: https://stackoverflow.com/a/5894697/1373170

実際、SOの質問全体に役立つ情報があるかもしれません: C#FileSystemWatcher、ファイルが完全に監視フォルダーにコピーされたことを知る方法

于 2012-12-25T15:46:48.977 に答える