【发布时间】:2012-01-28 05:03:41
【问题描述】:
我有大约 5-6 个服务器管理器程序,它们将自己的配置文件写入特定文件夹,例如 C:\ACME。配置文件都以 *ServerConfig.cfg" 结尾,其中 * = 创建它的程序名称。
我有一个具有 FileSystemWatcher 设置的 Windows 服务,我希望在每次程序更新时通过 FTP 传输配置文件。我已经让一切正常工作,但我注意到不同的服务器管理器程序的行为不同。
保存配置文件时,FileSystemWatcher 会接收两个“更改”事件。这导致我的程序将配置文件 FTP 两次,而我只需要一次。
在其他情况下,我发现它在保存配置文件时可能会创建 4、5 或 6 个“更改”事件。
当这些文件真正完成时,处理/FTP 处理这些文件的最佳方法是只保存一次。
我真的不想设置一些东西来经常轮询目录中的文件更改......并且就像每次保存配置时的想法一样,我会得到一个副本以及附加到文件名的日期/时间戳复制到别处。
我在 Google 上看到了很多建议,甚至在 Stackoverflow 上也看到了这里,但对我来说似乎没有什么是一体的。
如果队列中尚不存在“更改”事件,我想我可以将文件名放入队列中。不知道这是否是最好的近似值。
这是我的示例代码:
启动代码:
private DateTime _lastTimeFileWatcherEventRaised = DateTime.Now;
_watcherCFGFiles = new FileSystemWatcher();
_watcherCFGFiles.Path = @"C:\ACME";
_watcherCFGFiles.IncludeSubdirectories = true;
_watcherCFGFiles.Filter = "*ServerConfig.cfg";
_watcherCFGFiles.NotifyFilter = NotifyFilters.Size;
//_watcherCFGFiles.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.FileName;
_watcherCFGFiles.Changed += new FileSystemEventHandler(LogFileSystemChanges);
_watcherCFGFiles.Created += new FileSystemEventHandler(LogFileSystemChanges);
_watcherCFGFiles.Deleted += new FileSystemEventHandler(LogFileSystemChanges);
_watcherCFGFiles.Renamed += new RenamedEventHandler(LogFileSystemRenaming);
_watcherCFGFiles.Error += new ErrorEventHandler(LogBufferError);
_watcherCFGFiles.EnableRaisingEvents = true;
这是“更改”事件的实际处理程序。如果第二个在 700 毫秒内,我将跳过第一个“更改”事件。但这并没有考虑产生 3-4 次更改事件的文件...
void LogFileSystemChanges(object sender, FileSystemEventArgs e)
{
string log = string.Format("{0} | {1}", e.FullPath, e.ChangeType);
if( e.ChangeType == WatcherChangeTypes.Changed )
{
if(DateTime.Now.Subtract(_lastTimeFileWatcherEventRaised).TotalMilliseconds < 700)
{
return;
}
_lastTimeFileWatcherEventRaised = DateTime.Now;
LogEvent(log);
// Process file
FTPConfigFileUpdate(e.FullPath);
}
}
【问题讨论】:
标签: c# filesystemwatcher