2013-04-28 130 views
0

我正在使用FileSystemWatcher來跟蹤目錄中的更改。問題是我必須跟蹤並修改任何最近在我監視的子目錄中創建的子目錄。截至目前,我只是使用Change事件檢測到一些更改,檢查FullPath是否是一個目錄,併爲該子目錄創建了一個新的FileSystemWatcher實例。無法從FileSystemEventArgs.FullPath訪問目錄,錯誤的目錄名稱

private static void StartMonitoringDir(string dir) 
     { 
      var fileWatcher = new FileSystemWatcher(dir) 
      { 
       EnableRaisingEvents = true, 
       Filter = "*.exe" 
      }; 

      var folderWatcher = new FileSystemWatcher(dir) 
      { 
       EnableRaisingEvents = true 
      }; 

      fileWatcher.Created += FileWatcherOnCreated; 
      fileWatcher.Changed += FileWatcherOnChanged; 
      folderWatcher.Created += FolderWatcherOnCreated; 
     } 

private static void FolderWatcherOnCreated(object sender, FileSystemEventArgs e) 
     { 
      var attr = File.GetAttributes(e.FullPath); 

      if (attr != FileAttributes.Directory) return; 

      StartMonitoringDir(e.FullPath); 
     } 

所以,這是問題所在。只要我創建一個目錄,Changed事件就會以"New Folder"名稱引發,因此當用戶重命名此文件夾並在其中進行修改時,我會得到文件夾的舊名稱"New Folder",而不是用戶指定的名稱。我無法知道文件夾的新名稱是什麼,也無法進行修改,因爲我的目錄名稱不正確。

回答

1

如果你不需要擔心有人離開「新建文件夾」文件夾,我會刪除你的'FolderWatcherOnCreated`事件處理程序,而是使用FileSystemWatcher.Renamed Event事件處理程序。

像這樣的事情可能做的伎倆你(我沒有測試的代碼):

folderWatcher.Renamed += FolderWatcherOnRenamed; 

private static void FolderWatcherOnRenamed(object sender, RenamedEventArgs e) 
{ 

    var attr = File.GetAttributes(e.FullPath); 

    if (attr == FileAttributes.Directory && e.OldName == "New Folder") 
    { 

     StartMonitoringDir(e.FullPath) 
    } 
} 
+0

卻沒有意識到'Renamed'事件的,謝謝。 – 2013-04-28 03:22:05

+0

不客氣:) – Tim 2013-04-28 03:22:23