我已经构建了一个小应用程序,允许我选择一个目录并计算该目录及其子目录中文件的总大小。应用程序来分析文件夹的大小? c#.net
它允许我选择一个驱动器,并使用驱动器直接文件夹填充树控件,然后我可以计算它的大小!
它是用.net编写的,只是在目录上循环,每个目录加起来就是文件大小。
它使我的电脑停止时,它运行在说窗口或程序文件文件夹。
我曾想过多线程,但我以前没有这样做过。
任何想法提高性能?
感谢
我已经构建了一个小应用程序,允许我选择一个目录并计算该目录及其子目录中文件的总大小。应用程序来分析文件夹的大小? c#.net
它允许我选择一个驱动器,并使用驱动器直接文件夹填充树控件,然后我可以计算它的大小!
它是用.net编写的,只是在目录上循环,每个目录加起来就是文件大小。
它使我的电脑停止时,它运行在说窗口或程序文件文件夹。
我曾想过多线程,但我以前没有这样做过。
任何想法提高性能?
感谢
由于您只是使用字符串来引用目录和文件,因此您的代码真的很难理解。在根目录上使用DirectoryInfo;使用DirectoryInfo.GetFileSystemInfos()获取该文件的FileSystemInfos列表;在该列表上迭代,为DirectoryInfo对象递归并仅添加FileInfo对象的大小。这应该是一个很快很多。
你想提高性能或增加系统的响应?
您可以通过指示spidering应用程序定期运行其消息队列循环来增加RESPONSIVENESS,该循环处理屏幕重绘等。这将允许您在执行扫描时给出进度更新,但实际上会降低性能(因为您'产生CPU优先权)。
这得到子目录:
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();
}
尝试注释掉所有更新UI的部分,如果它仍然慢的磁盘I/O,没有什么可以做的,如果速度更快,你可以更新每个X文件的UI以保存UI工作。
您可以通过在工作线程中执行所有工作来使UI响应,但它会使其稍微慢一些。
磁盘I/O比较慢它也是其他应用程序经常需要的(交换文件,临时文件...),多线程也没有多大帮助,所有的文件都在同一个物理磁盘上,磁盘I/O很可能是瓶颈。
只是一个猜测,但我敢打赌,你的性能打击涉及用户界面,而不是文件扫描。注释掉创建TreeNode的代码。
尽量不要让你的树漆,直到您完成扫描后:
确保您的所有文件的根树节点不添加到treey。添加所有子项,然后在处理的最后添加“顶部”节点。看看它是如何工作的。
我只是建议使用background worker来完成工作。你可能想要确保不应该使用的控件不是可用的,但任何可用的控件都可以保持可用。
谷歌:http://www.google.com/search?q=background+worker
这将使您的应用程序是多线程与出一些多线程的复杂性。一切都被打包了起来,使用起来很方便。
让我们来看看你的代码。 – RedFilter 2009-06-08 19:23:07
我不想被否定,但你正在重新发明轮子。这可能是一个更好的替代方案http://foldersize.sourceforge.net/ – Kane 2009-06-08 19:27:31