2009-06-08 54 views
2

我已經構建了一個小應用程序,允許我選擇一個目錄並計算該目錄及其子目錄中文件的總大小。應用程序來分析文件夾的大小? c#.net

它允許我選擇一個驅動器,並使用驅動器直接文件夾填充樹控件,然後我可以計算它的大小!

它是用.net編寫的,只是在目錄上循環,每個目錄加起來就是文件大小。

它使我的電腦停止時,它運行在說窗口或程序文件文件夾。

我曾想過多線程,但我以前沒有這樣做過。

任何想法提高性能?

感謝

+0

讓我們來看看你的代碼。 – RedFilter 2009-06-08 19:23:07

+0

我不想被否定,但你正在重新發明輪子。這可能是一個更好的替代方案http://foldersize.sourceforge.net/ – Kane 2009-06-08 19:27:31

回答

3

由於您只是使用字符串來引用目錄和文件,因此您的代碼真的很難理解。在根目錄上使用DirectoryInfo;使用DirectoryInfo.GetFileSystemInfos()獲取該文件的FileSystemInfos列表;在該列表上迭代,爲DirectoryInfo對象遞歸併僅添加FileInfo對象的大小。這應該是一個很快很多。

0

你想提高性能或增加系統的響應?

您可以通過指示spidering應用程序定期運行其消息隊列循環來增加RESPONSIVENESS,該循環處理屏幕重繪等。這將允許您在執行掃描時給出進度更新,但實際上會降低性能(因爲您'產生CPU優先權)。

0

這得到子目錄:

string[] directories = Directory.GetDirectories(node.FullPath); 
        foreach (string dir in directories) 
        { 
         TreeNode nd = node.Nodes.Add(dir, dir.Substring(dir.LastIndexOf("\\")).Replace("\\", ""), 3); 
         if (showItsChildren) 
          ShowChildDirectories(nd, true); 
         size += GetDirectorySize(nd.FullPath); 
        } 

Thsi計算文件大小:

long b = 0; 

       // Get array of all file names. 
       string[] a = Directory.GetFiles(p, "*.*"); 

       // 2 
       // Calculate total bytes of all files in a loop. 
       foreach (string name in a) 
       { 
        // 3 
        // Use FileInfo to get length of each file. 
        FileInfo info = new FileInfo(name); 
        b += info.Length; 
        IncrementCount(); 
       } 
0

嘗試註釋掉所有更新UI的部分,如果它仍然慢的磁盤I/O,沒有什麼可以做的,如果速度更快,你可以更新每個X文件的UI以保存UI工作。

您可以通過在工作線程中執行所有工作來使UI響應,但它會使其稍微慢一些。

磁盤I/O比較慢它也是其他應用程序經常需要的(交換文件,臨時文件...),多線程也沒有多大幫助,所有的文件都在同一個物理磁盤上,磁盤I/O很可能是瓶頸。

0

只是一個猜測,但我敢打賭,你的性能打擊涉及用戶界面,而不是文件掃描。註釋掉創建TreeNode的代碼。

儘量不要讓你的樹漆,直到您完成掃描後:

確保您的所有文件的根樹節點不添加到treey。添加所有子項,然後在處理的最後添加「頂部」節點。看看它是如何工作的。

1

我只是建議使用background worker來完成工作。你可能想要確保不應該使用的控件不是可用的,但任何可用的控件都可以保持可用。

谷歌:http://www.google.com/search?q=background+worker

這將使您的應用程序是多線程與出一些多線程的複雜性。一切都被打包了起來,使用起來很方便。