2012-08-28 64 views
4

可能重複:
How do I get a directory size (files in the directory) in C#?如何在C#中獲取文件夾大小?

在VBScript中,這是非常簡單的GB或MB來獲取文件夾大小:

Set oFSO = CreateObject("Scripting.FileSystemObject") 
Dim fSize = CInt((oFSO.GetFolder(path).Size/1024)/1024) 
WScript.Echo fSize 

在C#中,用我所有的搜索,我可以想出所有子文件夾中的每個文件大小都是漫長的,複雜的遞歸搜索,然後在最後添加它們。

沒有其他辦法嗎?

+0

的VBScript和C在不同環境下運行#,你知道的。也許最簡單的方法是從您的應用程序運行VBScript。檢查了這一點:http://stackoverflow.com/questions/200422/how-to-call-a-vbscript-file-in-a-c-sharp-application –

+0

@AndreCalil:不;這不是最簡單的方法。 – SLaks

+0

@SLaks你能指出什麼是更簡單的方法嗎?除了文件總數之外,我不知道任何內置解決方案。 –

回答

20

如何:

private static long GetDirectorySize(string folderPath) 
{ 
    DirectoryInfo di = new DirectoryInfo(folderPath); 
    return di.EnumerateFiles("*", SearchOption.AllDirectories).Sum(fi => fi.Length); 
} 

here

這會給你以字節爲單位的大小;你將不得不把它「美化」成GB或MB。

注:在.NET 4+這隻作品。

編輯:根據我鏈接到的線索中的評論,將通配符搜索從"*.*"更改爲"*"。這應該將其可用性擴展到其他操作系統(例如,如果使用Mono)。

+0

對我來說編輯太小了,但我認爲你的意思是把'.Sum(di => di.Length);' – Spacemancraig

+0

+1因爲我喜歡這個解決方案。 –

+3

@Spacemancraig:不,「fi」應該是正確的,因爲我們命名了由'di.EnumerateFiles()'枚舉的每個'FileInfo'對象。 –

1

您還可以使用遞歸來獲取所有子目錄和總結大小:

public static long GetDirectorySize(string path){ 
    string[] files = Directory.GetFiles(path); 
    string[] subdirectories = Directory.GetDirectories(path); 

    long size = files.Sum(x => new FileInfo(x).Length); 
    foreach(string s in subdirectories) 
     size += GetDirectorySize(s); 

    return size; 
} 
+1

正確,但* 「在C#中,通過我所有的搜索,我能想出的所有子文件夾中的每個文件大小都是漫長而複雜的遞歸搜索,然後在最後添加它們。」* –

相關問題