我将首先道歉,如果这是一个重复的问题。有大量的FileSystemWatcher问题,但我没有看到任何解决我的问题的方法。
好的,所以我在C#中有一个控制台应用程序正在监视目录,我们将其称为Root
。 Root
有许多子文件夹。此应用程序的目的是在Root
或其任何子文件夹中创建,修改或删除任何.csv文件的情况下,将其写入日志文件。目前,我的工作还不错。唯一的问题是,创建,修改或删除.csv文件时,实际上会引发所有3个事件。
例如,如果我在Root
中创建一个名为test.csv
的文件,则日志文件将如下所示:
10/04/2012: File F:/Root/test.csv Created
10/04/2012: File F:/Root/test.csv Changed
10/04/2012: File F:/Root/test.csv Created
10/04/2012: File F:/Root/test.csv Deleted
我不确定发生了什么,所以这是设置
FileSystemWatcher
的代码 _watchFolder.Path = ConfigurationManager.AppSettings["RootToWatch"];
_watchFolder.Filter = ConfigurationManager.AppSettings["FileNameToWatch"];
_watchFolder.NotifyFilter = NotifyFilters.FileName
| NotifyFilters.LastWrite;
_watchFolder.IncludeSubdirectories = true;
_watchFolder.Changed += new FileSystemEventHandler(OnChanged);
_watchFolder.Created += new FileSystemEventHandler(OnChanged);
_watchFolder.Deleted += new FileSystemEventHandler(OnChanged);
_watchFolder.Renamed += new RenamedEventHandler(OnRenamed);
try
{
_watchFolder.EnableRaisingEvents = true;
}
catch (ArgumentException ex)
{
AbortMonitoring(ex.Message);
}
这是我的OnChanged事件(重命名是相同的,但参数不同)
protected static void OnChanged(object sender, FileSystemEventArgs e)
{
//compile message to insert into log file.
string message = "File: " + e.FullPath + " " + e.ChangeType;
UpdateLogFile(message);
}
最佳答案
只需为changed
事件添加一个处理程序。它应该收集所有变更类型。如果您希望仅在特定更改类型上引发事件,则可以使用其他类型的事件,例如created
。
watchFolder.IncludeSubdirectories = true;
_watchFolder.Changed += new FileSystemEventHandler(OnChanged);
关于c# - FileSystemWatcher引发多个事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12731991/