C#獲取文件夾所占空間大小的功能
雖然現(xiàn)在硬盤越來越大,但是清理垃圾還是必要的。這時(shí)我們往往需要一個(gè)獲取文件夾所占空間大小的功能,從而判斷垃圾文件的位置。
這個(gè)時(shí)候,我們常用的在右鍵屬性中查看文件夾所占空間的方法顯得效率實(shí)在太低。往往需要一些工具來輔助實(shí)現(xiàn)這個(gè)功能。一般有兩個(gè)工具可以實(shí)現(xiàn)這個(gè)功能:diruse和du。diruse是MS在系統(tǒng)中的一個(gè)附加的工具,du是sysinternals公司的,不過sysinternals好像已經(jīng)被MS收購(gòu)了。這兩個(gè)工具都是命令行工具,但也保持著MS一貫的簡(jiǎn)單易用的特點(diǎn)。
這里以diruse為例介紹其用法:
diruse /M /* c:\OTHER
Size (mb) Files Directory
2.91 14 SUB-TOTAL: C:\OTHER\BusinessInfo
61.98 1309 SUB-TOTAL: C:\OTHER\software
41.60 41 SUB-TOTAL: C:\OTHER\drivers
0.02 21 SUB-TOTAL: C:\OTHER\work
3.03 9 SUB-TOTAL: C:\OTHER\config
0.00 3 SUB-TOTAL: C:\OTHER\lnetwork
182.16 537 SUB-TOTAL: C:\OTHER\bkup
14.71 6 SUB-TOTAL: C:\OTHER\vpnclient
1.81 60 SUB-TOTAL: C:\OTHER\info
817.20 224 SUB-TOTAL: C:\OTHER\tools
515.25 449 SUB-TOTAL: C:\OTHER\wtnfiles
3089.50 10765 SUB-TOTAL: C:\OTHER\MP3
4730.18 13438 TOTAL
可以非常直觀的看到各個(gè)文件夾所占的空間。
但是一個(gè)非常郁悶的地方是:這兩個(gè)程序都不支持中文,一旦碰到中文文件夾就暈菜了,無法顯示全部路徑。作為MS的官方工具,有這個(gè)bug確實(shí)讓人大跌眼鏡。沒辦法,我只好寫了個(gè)程序來糾正這個(gè)bug。
class DirUseInfo { public string Path { get; private set; } public int Percent { get; private set; } public int FileCount { get; set; } public long Size { get; set; } Lazy<DirUseInfo[]> subDirs; public DirUseInfo[] SubDirs { get { return subDirs.Value; } } private DirUseInfo(string path, long size, int fileCount,int percent) { this.Path = path; this.Size = size; this.FileCount = fileCount; this.Percent = percent; this.subDirs = fileCount == 0 ? new Lazy<DirUseInfo[]>() : new Lazy<DirUseInfo[]>(() => GetDirUseInfo(path)); } public override string ToString() { return string.Format("[{0}% {1} {2}]", Percent, Size, Path); } public static DirUseInfo[] GetDirUseInfo(string dir) { var subDirs = Directory.GetDirectories(dir); var p = Process.Start(new ProcessStartInfo(@"D:\Tools\Du\diruse.exe", @"/* " + dir) { UseShellExecute = false, RedirectStandardOutput = true, }); p.WaitForExit(); var output = p.StandardOutput.ReadToEnd(); var matches = Regex.Matches(output, @"(\d+|Access Denied)\s+(\d+).+"); if(subDirs.Length!=matches.Count-1) //match最后一項(xiàng)是匯總 throw new InvalidOperationException(); var totalSize = long.Parse(matches[matches.Count - 1].Groups[1].Value); var dirsUseInfo = new DirUseInfo[subDirs.Length]; for (int i = 0; i < dirsUseInfo.Length; i++) { var groups = matches[i].Groups; var path = subDirs[i]; var fileCount = int.Parse(groups[2].Value); var size = matches[i].Value.StartsWith("Access Denied") ? 0 : long.Parse(groups[1].Value); var percent = (int)(size * 100 / totalSize); dirsUseInfo[i] = new DirUseInfo(path, size, fileCount, percent); } return dirsUseInfo; } }
原理很簡(jiǎn)單,僅僅是用C#把diruse的輸出封裝和匹配了一下,使其生成一個(gè)DirUseInfo的對(duì)象,利用diruse的輸出獲取了一些常用的信息。從而可以集成到windows程界面的程序中去。我自己用的時(shí)候是用wpf寫了一個(gè)界面的,不過還不是很令人滿意,就不獻(xiàn)丑了。這里就僅僅提供一下diruse的封裝,以供有同樣需求的朋友參考。
到此這篇關(guān)于C#獲取文件夾所占空間大小的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實(shí)現(xiàn)
本文主要介紹了C#服務(wù)器NFS共享文件夾搭建與上傳圖片文件的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)
c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)...2007-08-08C# 實(shí)現(xiàn)Scoket心跳機(jī)制的方法
這篇文章主要介紹了C# 實(shí)現(xiàn)Scoket心跳機(jī)制的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02C#對(duì)Access進(jìn)行增刪改查的完整示例
本文主要是講C#對(duì)Access數(shù)據(jù)庫(kù)的增刪改查操作,想學(xué)習(xí)C#和Access數(shù)據(jù)庫(kù)操作基礎(chǔ)的可以參考借鑒,以下代碼都經(jīng)過實(shí)踐測(cè)試可用,下面跟著小編一起來看看。2016-08-08C#抓取網(wǎng)頁(yè)數(shù)據(jù) 解析標(biāo)題描述圖片等信息 去除HTML標(biāo)簽
本文主要一步一步介紹利用C#抓取頁(yè)面數(shù)據(jù)的過程,抓取HTML,獲取標(biāo)題、描述、圖片等信息,并去除HTML,希望對(duì)大家有所幫助。2016-04-04Unity實(shí)現(xiàn)10天簽到系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)10天簽到系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04