ディレクトリの画像を監視して処理するシステムをセットアップしています。
時々PDFが監視ディレクトリにドロップされることがありますが、この場合は画像に変換して通常どおり続行します。
ただし、画像が処理されると、画像は完全なフォルダに移動されますが、PDFから画像への変換が完了していない場合、別のプロセスで使用されているファイルを移動できないため、コードはIO例外をスローします。
通知フィルターを指定して「完全な」ファイルのみを処理することは可能ですか。完全とは、コピー、移動、または作成が完了したことを意味します。
この競合は、ファイルを処理するワーカーが異なるスレッドで実行されているために発生すると推測しています。
public void Start()
{
if (string.IsNullOrWhiteSpace(this.fileDirectory))
{
throw new Exception("No file directory specified.");
}
// watch for any type of file activity
const NotifyFilters Filters = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.CreationTime;
// set up the watcher based on the app.config file
var watcher = new FileSystemWatcher() { Path = this.fileDirectory, NotifyFilter = Filters, EnableRaisingEvents = true };
// event handler for new files
watcher.Created += this.NewFileCreated;
// file system watcher doesn't "see" current files, manually get these
this.ProcessExistingFiles();
}
private void NewFileCreated(object source, FileSystemEventArgs e)
{
Task.Run(() => this.ProcessFile(e.FullPath));
}
private void ProcessExistingFiles()
{
var files = Directory.GetFiles(this.fileDirectory);
Parallel.ForEach(files, this.ProcessFile);
}