1

ディレクトリの画像を監視して処理するシステムをセットアップしています。

時々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);
}
4

2 に答える 2

0

私の理解では、監視対象ディレクトリに到着するファイルには、画像とPDFの2種類のファイルがあります。PDFが届いた場合は、最初にそれを画像に変換する必要があります。あなたが説明する例外の理由はわかりません-変換と処理(最後に移動)が同時に行われるのですか?

そうでない場合-あなたは間違った場所を探しています。そもそもファイルをそこに置いたプロセスがまだハンドルを握っている可能性があります。

答えが「はい」の場合、2つの提案があります。

  1. PDFファイルを別のフォルダに入れます。変換プロセスはこのフォルダをリッスンし、画像が抽出されるとすぐに移動します。このように、現在のアルゴリズムで何も変更する必要はなく、別の分離レベルを追加するだけです。

  2. または、FSWにフィルターを設定して、画像ファイル(フィルターファイル拡張子)のみを監視することもできます。この方法では、pdfがディレクトリに配置されたときに、すぐに処理に進むのではなく、最初に画像に変換されます。変換の最後に、監視対象のディレクトリが突然別の別の画像を「受信」します。そして、プロセスは通常どおり続行されます。これは基本的に、画像とPDFを分離するためのもう1つの方法です。

于 2012-07-24T10:18:07.613 に答える
0

この操作が失敗した場合 (ファイルが完了していない場合) は、書き込みのためにファイルをロックすることを試みることができます。しばらく待ちます (たとえば、次の変更または 1 秒)。

于 2012-07-24T10:22:51.800 に答える