我有大約5-6個服務器管理器程序,它們將自己的配置文件寫入特定文件夾,例如C:\ ACME。配置文件全部以* ServerConfig.cfg結尾,其中* =創建它的程序名稱FileSystemWatcher和監視配置文件更改
我有一個Windows服務,它有一個FileSystemWatcher設置,我希望每次程序更新時都會FTP配置文件。已經得到了一切工作,但我注意到,不同的服務器管理器程序的行爲有所不同。
當保存配置文件時,FileSystemWatcher正在拾取兩個「更改」事件,這導致我的程序到FTP配置文件兩次,我只需要它一次。
在其他情況下,我看到它可能會在保存配置文件時創建4,5或6個「更改」事件。
什麼是最好的方式來處理/ FTP這些文件時,他們真的完成保存只有一次。
我真的不想o設置一些東西來輪詢filechanges的目錄,每隔一段時間就會這樣......而且就像每次保存配置的想法一樣,我會得到一個重複的副本以及附加到日期/時間戳的附加到文件名複製到別處
我已經看到了很多的建議谷歌搜索,甚至在這裏在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;
下面是對於 「改變」 事件實際處理程序。如果第二個在700ms內,我將跳過第一個「更改」事件。但是,這並不考慮,使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);
}
}
它沒有殺毒軟件。在某些情況下,配置程序似乎會多次保存文件。按下「確定」後,每次在表格內更新條目時,一個特定的程序會自動保存。 HashTable的想法似乎很有趣...因爲每個配置文件是唯一的,我想我可以使關鍵字的文件名和值e.FullPath?也許使用System.Timer每10-15分鐘檢查一次HashTable? 我想知道有沒有人在做過這種技術之前和/或是否有示例代碼.... – user500741 2012-01-28 05:25:20