2009-06-08 52 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

这将使您的应用程序是多线程与出一些多线程的复杂性。一切都被打包了起来,使用起来很方便。