2013-04-28 62 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