【发布时间】:2016-03-23 13:33:54
【问题描述】:
我将首先给出一些上下文
简介
我正在创建一个将在服务器上连续运行的程序。该计划的一部分是能够向不同的代表发送自动邮件。这些邮件的内容会自动放在一个文件夹中,因此当新内容准备好时需要通知程序并读取该文件中的文本。不过这不是问题,我已经有了解决方案。
问题
文件夹中可能会同时放置多个文件,这是我的程序无法处理的情况。我得到以下异常:
System.IO.IOException: 进程无法访问文件 GENERATEDFILE 因为它正被另一个进程使用。
一旦程序尝试读取已放入文件夹中的文件,它就会给我这个异常,我无法理解为什么会这样
我已经拥有的
所以我有一个方法可以像这样创建 FileSystemWatcher:
public void Watch(){
_watcher = new FileSystemWatcher();
_watcher.NotifyFilters = NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName |
NotifyFilters.DirectoryName;
_watcher.Created += OnCreated
}
private void OnCreated(object sender, FileSystemEventArgs e){
//read the file that got created here and pass the content to an object that wille handle it further
}
非常简单,我们创建了一个 FileSystemWatcher,我们为其附加了一些 NotifyFilters 和 OnCreated 事件
我已经尝试了以下
在 OnCreated 方法中我尝试了以下方法
-
File.ReadAllText(filePath)我认为这是读取文件的标准方式,但这不起作用 -
using (StreamReader sr = new StreamReader(filePath)){ String line = sr.ReadToEnd();}来自微软 - 我试过
Thread.Sleep(5000)看是否需要一些时间,没有效果 - 我试过使用
ReaderWriterLockSlim类,每次开始阅读时都会进入readlock,这个解决方案有时有效,但不足以保证 - 我尝试将每个文件放入一个列表中,然后遍历该列表,但仍然给我同样的异常
问题
有没有办法处理多个文件同时放入文件夹的事件?
【问题讨论】:
-
注意在你的事件处理程序中做“太多”:"Keep your event handling code as short as possible"。因为否则你可能会“miss an event when the buffer size is exceeded”。考虑在您的
OnCreated()中排队工作,而不是尝试在当时和那里处理文件。否则,快乐的格式很好的问题。 :)
标签: c# multithreading file filesystemwatcher