我有一个小应用程序,它监视一个特定的文件,每当它发生变化时,我的应用程序应该在循环中执行操作,但有些东西会不止一次触发该函数!这是我的代码
private void OnChanged(object source, FileSystemEventArgs e)
{
if (e.FullPath == @"C:\test.txt")
{
string textFilePath = @"C:\test.txt";
try
{
using (var streamReader = File.OpenText(textFilePath))
{
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
//actions here
}
}
}
catch (Exception)
{
}
}
}
所以当我在Streamreader做File.OpenText以某种方式再次触发该函数时,我在循环中猜测?!任何想法?
答案 0 :(得分:2)
来自MSDN:
当对大小,系统属性,上次写入时间,上次访问时间进行更改时,会引发Changed事件,...
所以是的,打开(实际上:关闭)文件将再次引发Changed事件。
您可以使用NotifyFilter来限制观察者触发的操作。
答案 1 :(得分:1)
<强>解强> 所以我做了一个控制问题的小事,我添加了一个计数器,并且总是检查它是不是第一次,跳过并重新分配给它。
private int fireCounter = 0;
private void OnChanged(object source, FileSystemEventArgs e)
{
fireCounter++;
if (fireCounter == 1)
{
delete();
if (e.FullPath == @"C:\test.txt")
{
Thread.Sleep(2000);
//I added Sleep for two seconds because without it sometimes it wont work
string textFilePath = @"C:\test.txt";
try
{
using (var streamReader = File.OpenText(textFilePath))
{
var lines = streamReader.ReadToEnd().Split("\r\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
//Actions Here
}
}
}
catch (Exception)
{
}
}
}
else
{
fireCounter = 0;
}
}