当将多个文件放入监视目录时,我遇到了 FileSystemWatcher 的问题。我想将文件放在目录中后立即对其进行解析。通常,第一个文件解析得很好,但是将第二个文件添加到目录会导致访问问题。有时,第一个文件甚至不解析。只有一个应用程序正在运行并监视此目录。最终,这个过程将在多台机器上运行,它们将监视一个共享目录,但只有一台服务器可以解析每个文件,因为数据被导入数据库并且没有主键。
这是 FileSystemWatcher 代码:
public void Run() {
FileSystemWatcher watcher = new FileSystemWatcher("C:\\temp");
watcher.NotifyFilter = NotifyFilters.FileName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
}
然后解析文件的方法:
private void OnChanged(object source, FileSystemEventArgs e) {
string line = null;
try {
using (FileStream fs = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.None)) {
using (StreamReader sr = new StreamReader(fs)) {
while (sr.EndOfStream == false) {
line = sr.ReadLine();
//parse the line and insert into the database
}
}
}
}
catch (IOException ioe) {
Console.WriteLine("OnChanged: Caught Exception reading file [{0}]", ioe.ToString());
}
移动第二个文件时,它正在捕获
System.IO.IOException:该进程无法访问文件“C:\Temp\TestFile.txt”,因为它正被另一个进程使用。
如果它在多台机器上运行,我希望看到这个错误,但它现在只在一台服务器上运行。不应该有其他进程使用此文件 - 我创建了它们并将它们复制到应用程序运行时的目录中。
这是设置 FileSystemWatcher 的正确方法吗?我怎样才能看到这个文件上的锁是什么?为什么它不解析这两个文件 - 我必须关闭 FileStream 吗?我想保留 FileShare.None 选项,因为我只想要一个服务器来解析文件 - 获取文件的服务器首先解析它。