【发布时间】:2014-01-29 08:13:23
【问题描述】:
我有一个包含 FileSystemWatcher 的方法来观察文本文件中的任何变化。这是我的方法。
public static void RunWatcher()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "D:\\CDR File";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.txt";
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
这是我从 RunWatcher() 方法调用的方法..
private static void OnChanged(object source, FileSystemEventArgs e)
{
int totalLines = File.ReadLines(FileToCopy).Count();
int newLinesCount = totalLines - ReadLinesCount;
File.ReadLines(FileToCopy).Skip(ReadLinesCount).Take(newLinesCount);
ReadLinesCount = totalLines;
Console.WriteLine("Hello World");
Console.ReadLine();
}
现在我在应用程序的 main 方法中调用了 RunWatcher() 方法,并在 RunWatcher() 方法中放置了一个断点。但是在调试时我无法调用 OnChanged ..这是什么问题?为什么它没有得到已调试并达到断点?
这是我根据 Hans Passant 的建议尝试的方法
string FileToCopy = "D:\\BEML.txt";
if (System.IO.File.Exists(FileToCopy) == true)
{
var fs = new FileStream(FileToCopy, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
using (var reader = new StreamReader(fs))
{
string line;
string rawcdr;
while ((line = reader.ReadLine()) != null)
{
}
}
}
【问题讨论】:
-
当然在 OnChanged 上设置断点。该代码非常不明智,您确实不想像这样使用 FSW 来衡量复制进度。您从CopyFileEx 获得进展。希望你的 D: 驱动器不是光驱,它不能工作。
-
@HansPassant FileSystemWatcher 是为了持续检查文本文件中的更新
-
对于每个更改通知,您正在阅读整个文件 两次。正如所写的那样,这是非常昂贵的,并且您会失去更改事件的几率非常非常。始终使用错误事件。通过使用 FileShare.ReadWrite 打开文件而不是关闭它来获得成功,这样您就不必从一开始就一遍又一遍地阅读它。请记住,在写入文件时您无法可靠地检测到文件结尾,最后一行可能是部分写入的文本行。您将其计为一行,下一次写入再次将其计为一行。
-
@HansPassant 对不起先生,但我不知道如何使用 FileShare.ReadWrite 连续使用读取文本文件。请帮助我..
标签: c# visual-studio-2010 debugging text-files filesystemwatcher