仿照ubuntu下的磁盘使用情况分析器用wpf做了个类似的软件,参考https://github.com/caliburn-micro/caliburn.micro/tree/3.2.0/samples/features/features.wpf使用caliburn.micro框架完成

 

项目地址:https://github.com/alittledruid/diskspaceanalyse

 

核心代码

public void analyse()                                                                                                                                                                  
{                                                                                                                                                                                      
    if (parent != null && !string.isnullorempty(foldername) && directory.exists(foldername))                                                                                           
    {                                                                                                                                                                                  
        directoryinfo di = new directoryinfo(foldername);                                                                                                                              
        if ((di.attributes & fileattributes.directory) != 0)                                                                                                                           
        {                                                                                                                                                                              
            try                                                                                                                                                                        
            {                                                                                                                                                                          
                var files = di.getfiles();
                var dirs = di.getdirectories(); //访问部分没有权限的目录会异常,捕获异常后忽略即可
                filecount = files.length;                                                                                                                                              
                foldercount = dirs.length;                                                                                                                                             
                foreach (fileinfo fi in files)                                                                                                                                         
                {                                                                                                                                                                      
                    size += fi.length;                                                                                                                                                 
                }                                                                                                                                                                      
                foreach (var item in dirs)                                                                                                                                             
                {                                                                                                                                                                      
                    if ((item.attributes & fileattributes.reparsepoint) != 0)                                                                                                          
                    {                                                                                                                                                                  
                        continue; //忽略符号链接,否则可能导致无限递归下去               
                    }                                                                                                                                                                  
                    var d = new foldertreemodel(item.fullname, this);                                                                                                                  
                    children.add(d);                                                                                                                                                   
                }                                                                                                                                                                      
                foreach (var item in children)                                                                                                                                         
                {                                                                                                                                                                      
                    item.analyse(); //无需担心递归层数过多导致stack overflow
                }                                                                                                                                                                      
            }                                                                                                                                                                          
            catch                                                                                                                                                                      
            {                                                                                                                                                                          
            }                                                                                                                                                                          
            var tmp = new list<foldertreemodel>(children);
            children.clear();
            children.addrange(tmp.orderbydescending(x => x.size)); //按文件夹大小排序
            parent.size += size;
        }                                                                                                                                                                              
    }                                                                                                                                                                                  
}