FileSystemWatcher 监控目录大小

Posted

技术标签:

【中文标题】FileSystemWatcher 监控目录大小【英文标题】:FileSystemWatcher to monitor directory size 【发布时间】:2012-05-08 00:05:51 【问题描述】:

您好,我正在创建一个 Windows 服务来监视某些目录,以查看目录的大小是否已达到其限制。 我创建了一个文件系统观察器,如下所示:

            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 following path has crossed the limit " + directory);
            //TODO: mail sending
        
    
    catch (Exception ex)
    
        eventLogCheck.WriteEntry(ex.ToString());
    


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

现在,当我将文件添加到目录时,这可以正常工作,例如.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;
        

【问题讨论】:

【参考方案1】:

您正在使用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
    
 ;

【讨论】:

这似乎是一个很好的解决方案,我确信它可以工作,但我是 VS C# 的新手,所以当我放置 watcher.Changed +=(sender,e)=> 时,它说这是一个无效的表达式长期帮助请 我也放了一个;在 lambda 表达式的末尾,但它不起作用 您使用的是什么版本的 C#?您需要 3.0 或更高版本才能使用 lambda 表达式。 我已对其进行了编辑以使其与 2.0 兼容,但您确实想升级 - 您错过了很多东西! 有什么方法可以找出哪个观察者调用了 Onchanged 事件

以上是关于FileSystemWatcher 监控目录大小的主要内容,如果未能解决你的问题,请参考以下文章

使用filesystemwatcher时怎么处理大文件

FileSystemWatcher用法详解

FileSystemWatcher用法详解

C#的FileSystemWatcher用法实例详解

C# 监控指定目录的文件变化

c# filesystemwatcher 监控文件是不是写完