使用C#,我找到了目录的总大小.逻辑是这样的:获取文件夹中的文件.总结总大小.查找是否有子目录.然后进行递归搜索.
我也尝试了另一种方法:使用FSO(obj.GetFolder(path).Size).这两种方法的时间差别不大.
现在的问题是,我在一个特定的文件夹中有成千上万的文件,它至少需要2分钟才能找到文件夹大小.此外,如果我再次运行程序,它会很快发生(5秒).我认为窗口正在缓存文件大小.
有什么方法可以减少我第一次运行程序时所花的时间吗?
我需要在VB .Net中计算目录大小
我知道以下两种方法
方法1:来自MSDN http://msdn.microsoft.com/en-us/library/system.io.directory.aspx
'以下示例计算目录'及其子目录的大小(如果有),并以字节为单位显示总大小.
Imports System
Imports System.IO
Public Class ShowDirSize
Public Shared Function DirSize(ByVal d As DirectoryInfo) As Long
Dim Size As Long = 0
' Add file sizes.
Dim fis As FileInfo() = d.GetFiles()
Dim fi As FileInfo
For Each fi In fis
Size += fi.Length
Next fi
' Add subdirectory sizes.
Dim dis As DirectoryInfo() = d.GetDirectories()
Dim di As DirectoryInfo
For Each di In dis
Size += DirSize(di)
Next di
Return Size
End Function …Run Code Online (Sandbox Code Playgroud) 我正在尝试以分割负载的方式计算目录大小,以便用户可以看到计数进度.我认为这样做的逻辑方法是首先创建目录树,然后执行计算所有文件长度的操作.
我意想不到的事情是,大部分时间(磁盘I/O)来自创建目录树,然后FileInfo[]几乎立即几乎没有磁盘I/O.
我尝试过这两种方法Directory.GetDirectories(),只需创建一个目录名字符串树,并使用一个DirectoryInfo对象,这两种方法仍然需要大量的I/O时间(当然是读取MFT),而不是全部FileInfo.Length用于每个目录中的文件.
我想没有办法减少I/O使树显着,我想我只是想知道为什么这个操作比翻阅更多的文件需要更多的时间?
此外,如果任何人都可以推荐一种非递归的方式来计算一些东西(因为看起来我需要分开枚举并平衡它以使大小统计更具响应性).为基础上的每个子目录创建一个线程并让调度程序竞争平衡可能不会很好,是吗?
编辑: 此代码的存储库
我不知道为什么我们会使用它Directory.GetFiles,如果Directory.EnumerateFiles能够做同样的事情,你甚至可以在返回找到的整个目录列表之前枚举列表.
Directory.EnumerateFiles与Directory.GetFiles有什么区别?
为什么,现在EnumerateFiles有可能需要使用GetFiles?
在我的 Windows 计算机家庭桌面上,我右键单击属性下的 C:\Windows 文件夹,它显示:

如果我使用Microsoft sysinternals提供的du工具
du C:\Windows
Run Code Online (Sandbox Code Playgroud)
这产生
Files: 77060
Directories: 21838
Size: 31,070,596,369 bytes
Size on disk: 31,151,837,184 bytes
Run Code Online (Sandbox Code Playgroud)
如果我以管理员身份运行相同的命令
Files: 77894
Directories: 22220
Size: 32,223,507,961 bytes
Size on disk: 32,297,160,704 bytes
Run Code Online (Sandbox Code Playgroud)
以管理员身份运行 Powershell ISE 后,我从这个SO 答案中运行了以下 powershell 片段
"{0:N2}" -f ((Get-ChildItem -path C:\InsertPathHere -recurse | Measure-Object -property length -sum ).sum /1MB) + " MB"
Run Code Online (Sandbox Code Playgroud)
哪个输出
22,486.11 MB
Run Code Online (Sandbox Code Playgroud)
以管理员身份运行的命令提示符中的以下SO 答案中的 C# 代码返回:
35,163,662,628 bytes
Run Code Online (Sandbox Code Playgroud)
尽管关闭它仍然显示与 Windows 资源管理器不同。因此,这些方法都没有返回目录的实际大小。所以我的问题是这个。
是否有脚本或编码方法可以返回 C:\Windows …
如何绕过/忽略 "拒绝访问路径"/ UnauthorizedAccess异常
并继续在此方法中收集文件名;
public static string[] GetFilesAndFoldersCMethod(string path)
{
string[] filenames = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Select(Path.GetFullPath).ToArray();
return filenames;
}
Run Code Online (Sandbox Code Playgroud)
//打电话......
foreach (var s in GetFilesAndFoldersCMethod(@"C:/"))
{
Console.WriteLine(s);
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序在GetFilesAndFoldersCMethod的第一行停止,一个异常说; "拒绝访问路径'C:\ @ Logs \'." 请帮我...
谢谢,