您好我是C#的新手,正在测试一个简单的openFileDialog程序。我目前编写的代码似乎正在完成它的工作,但输出产生了两次。任何帮助将不胜感激。
我的代码:
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
MessageBox.Show("copying done");
StreamReader inStream = new StreamReader(destFile);
string line;
string[] lineSplit;
bool errorFound = false;
while ((line = inStream.ReadLine()) != null)
{
lineSplit = line.Split(' ');
for (int i = 0; i < lineSplit.Length; i++)
{
if (lineSplit[i] == textBox2.Text)
{
errorFound = true;
MessageBox.Show("Error found in " + e.Name);
MessageBox.Show("Exiting");
break;
}
}
}
inStream.Close();
}
输出:
Copying Done
File: ..Changed
Copying Done
File: ..Changed
只是想知道为什么会打印两次?
答案 0 :(得分:5)
因为它会在OnChanged
和watcher.Created
watcher.Changed
答案 1 :(得分:4)
您已多次附加到同一个处理程序:
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
例如,如果Changed
和Created
事件运行,您将获得两次相同的输出。
您可能想要做的是为每个事件创建单独的方法。我不知道watcher
是什么,但这是一个大致的想法:
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);
private void OnCreated(object source, FileSystemEventArgs e)
{
// do something when the watcher is created
}
private void OnDeleted(object source, FileSystemEventArgs e)
{
// do something when the watcher is deleted
}
答案 2 :(得分:1)
您需要记住的是,单个IO操作可以触发多个不同的FileSystemWatcher
事件。
通用文件系统操作可能会引发多个事件。例如,当文件从一个目录移动到另一个目录时,可能会引发一些OnChanged和一些OnCreated和OnDeleted事件。
最有可能的是,这里发生的是文件创建正在触发Create事件和Change事件(我相信windows倾向于创建一个初始文件(触发创建)然后写入它(触发更改)) 。但是,这完全取决于您正在执行的操作。
答案 3 :(得分:0)
这就是我修复它的方法,不知道它是不是最好的方法,但它有效!
private static void OnChanged(object source, FileSystemEventArgs e)
{
//set EnableRaisingEvents = false at the start of the method.
FileSystemWatcher t = source as FileSystemWatcher;
t.EnableRaisingEvents = false;
//do stuff that you want in the method, in my case checking for words.
....
....
//Set EnableRaisintEvents true again
t.EnableRaisingEvents = true;
}
这个小小的修复确保每次更改只会引发一次事件,而不是两次。