2012-04-27 99 views
2

嗨我正在创建一个Windows服务来观察某些目录,看看目录的大小是否达到其限制。 我创建了一个档案系统观察家如下FileSystemWatcher来监视目录大小

  FileSystemWatcher watcher = new FileSystemWatcher(); 
      watcher.Path = dirPaths[i].ToString(); 
      watcher.NotifyFilter = NotifyFilters.Size; 
      watcher.EnableRaisingEvents = true; 
      watcher.Changed += new FileSystemEventHandler(OnChanged); 

private void OnChanged(object source, FileSystemEventArgs e) 
    { 
     try 
     { 


     string directory = new DirectoryInfo(e.FullPath).Parent.FullName;//gettting the directory path from the full path 

     float dirSize = CalculateFolderSize(directory); 

     float limitSize = int.Parse(_config.TargetSize);//getting the limit size 


     if (dirSize > limitSize) 
     { 
      eventLogCheck.WriteEntry("the folloing path has crossed the limit " + directory); 
      //TODO: mail sending 
     } 
    } 
    catch (Exception ex) 
    { 
     eventLogCheck.WriteEntry(ex.ToString()); 
    } 

} 

CalculateFolderSize检查在驱动器中的所有文件和子目录的大小。

现在,当我将文件添加到目录EQ一个的.xls和.txt等文件,但如果我将文件夹添加到目录它不会触发给onChanged事件能正常工作?

如果我启用

watcher.IncludeSubdirectories = true; 

它并触发给onChanged事件,但在这种情况下,只检查子目录,而不是整个目录。

请有人可以告诉我怎样才能得到这个工作,这样当我的文件夹复制到该目录正在看着它触发给onChanged事件并计算目录

我CalculateFolderSize功能为一体的新的大小如下如果这有助于

//function to calculate the size of the given path 
     private float CalculateFolderSize(string folder) 
     { 
      float folderSize = 0.0f; 
      try 
      { 
       //Checks if the path is valid or not   
       if (!Directory.Exists(folder)) 
       { 
        return folderSize; 
       } 
       else 
       { 
        try 
        { 
         foreach (string file in Directory.GetFiles(folder)) 
         { 
          if (File.Exists(file)) 
          { 
           FileInfo finfo = new FileInfo(file); 
           folderSize += finfo.Length; 
          } 
         } 
         foreach (string dir in Directory.GetDirectories(folder)) 
         { 
          folderSize += CalculateFolderSize(dir); 
         } 
        } 
        catch (NotSupportedException ex) 
        { 
         eventLogCheck.WriteEntry(ex.ToString()); 
        } 
       } 
      } 
      catch (UnauthorizedAccessException ex) 
      { 
       eventLogCheck.WriteEntry(ex.ToString()); 
      } 
      return folderSize; 
     } 

回答

5

您正在使用由FileSystemEventArgs提供的文件夹路径,以便将已更改的文件夹。相反,请为您正在监视的每个目录根目录创建一个对象,并在其中存储根路径并使用该对象而不是EventArgs

您可能会发现一个简单的方法来创建这个对象就是使用lambda函数为事件处理程序如下。这有效地将外部范围的路径封装到您正在监视的每个路径的不同对象中。

FileSystemWatcher watcher = new FileSystemWatcher(); 
watcher.Path = dirPaths[i].ToString(); 
watcher.NotifyFilter = NotifyFilters.Size; 
watcher.EnableRaisingEvents = true; 
watcher.Changed += delegate (object source, FileSystemEventArgs e) 
{ 
    float dirSize = CalculateFolderSize(watcher.Path); // using the path from the outer scope 

    float limitSize = int.Parse(_config.TargetSize);//getting the limit size 

    if (dirSize > limitSize) 
    { 
     eventLogCheck.WriteEntry("the folloing path has crossed the limit " + directory); 
     //TODO: mail sending 
    } 
}; 
+0

这似乎是一个很好的解决方案和IM确保它的工作原理,但我是新来的VS C#,所以当我把watcher.Changed + =(发件人,E)=>它说,它是一个无效的表达式项帮助请问 – mayukh 2012-04-27 09:13:17

+0

我也放了一个;在lambda表达式的末尾,但它不起作用 – mayukh 2012-04-27 09:25:27

+1

您使用的是什么版本的C#?您需要3.0版或更高版本才能使用lambda表达式。 – 2012-04-27 09:26:12