我正在建立一个系统来监视图像目录然后处理它们。
有时 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);
}