应用程序分析文件夹大小? c#.net

时间:2009-06-08 19:21:35

标签: c# .net

我构建了一个小应用程序,允许我选择一个目录并计算该目录及其子目录中文件的总大小。

它允许我选择一个驱动器,并使用驱动器立即文件夹填充树控件,然后我可以计算它的大小!

它是用.net编写的,只是循环遍历目录,每个目录都会增加文件大小。

当它运行在说Windows或程序文件文件夹时,它会让我的电脑暂停。

我曾想过多线程,但我之前没有这样做过。

任何提高绩效的想法?

感谢

6 个答案:

答案 0 :(得分:3)

您的代码实际上很糟糕,因为您只是使用字符串来引用目录和文件。在根目录中使用DirectoryInfo;使用DirectoryInfo.GetFileSystemInfos()获取该文件的SystemSystemInfos列表;迭代该列表,递归DirectoryInfo对象,只添加FileInfo对象的大小。那应该快点多了。

答案 1 :(得分:1)

我只是建议使用background worker来完成工作。您可能希望确保不应该使用的控件不是,但任何可用的控件都可以保持可用。

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

这将允许您的应用程序具有多线程,而不会出现多线程的一些复杂性。所有东西都已打包好用,方便使用。

答案 2 :(得分:0)

您想提高性能还是提高系统响应能力?

您可以通过指示蜘蛛应用程序定期运行其消息队列循环来处理屏幕重新绘制等来增加RESPONSIVENESS。这将允许您在执行扫描时提供进度更新,同时实际降低性能(因为您'重新产生CPU优先级。)

答案 3 :(得分: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);
                    }

这会计算文件大小:

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();
                }

答案 4 :(得分:0)

尝试注释掉更新UI的所有部分,如果它仍然很慢,那就是磁盘I / O并且你无能为力,如果它变得更快,你可以更新每个X文件的UI以节省UI工作。 / p>

您可以通过在工作线程中完成所有工作来使您的UI响应,但它会使它稍慢。

磁盘I / O相对较慢,它也经常需要其他应用程序(交换文件,临时文件...),多线程也无济于事,所有文件都在同一个物理磁盘上,而且它是可能是磁盘I / O是瓶颈。

答案 5 :(得分:0)

只是一个猜测,但我打赌你的性能打击涉及UI而不是文件扫描。注释掉创建TreeNode的代码。

在完成扫描之前,请尽量不要让树木涂漆:

确保所有文件的根树节点未添加到树状结构中。添加所有子项,然后在处理的最后添加“顶部”节点/节点。看看它是如何工作的。