Vir*_*dra 7 vb.net directory size
我需要在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 'DirSize
Public Shared Sub Main(ByVal args() As String)
If args.Length <> 1 Then
Console.WriteLine("You must provide a directory argument at the command line.")
Else
Dim d As New DirectoryInfo(args(0))
Dim dsize As Long = DirSize(d)
Console.WriteLine("The size of {0} and its subdirectories is {1} bytes.", d, dsize)
End If
End Sub 'Main
End Class 'ShowDirSize
Run Code Online (Sandbox Code Playgroud)
方法2:从什么是计算.NET目录大小的最佳方法?
Dim size As Int64 = (From strFile In My.Computer.FileSystem.GetFiles(strFolder, _
FileIO.SearchOption.SearchAllSubDirectories) _
Select New System.IO.FileInfo(strFile).Length).Sum()
Run Code Online (Sandbox Code Playgroud)
这两种方法都很好.但是,如果存在大量子文件夹,则需要花费大量时间来计算目录大小.例如,我有一个包含150,000个子文件夹的目录.上述方法花了大约1小时30分钟来计算目录的大小.但是,如果我从窗户检查尺寸不到一分钟.
请建议更好,更快的方法来计算目录的大小.
小智 5
虽然这个答案谈论的是 Python,但这个概念也适用于这里。
Windows 资源管理器使用系统 API 调用FindFirstFile
并FindNextFile
递归地提取文件信息,然后可以通过 , 传回的数据非常快速地访问文件大小struct
: http WIN32_FIND_DATA
: //msdn.microsoft.com/en-us/library/aa365740( v=VS.85).aspx。
我的建议是使用 P/Invoke 来实现这些 API 调用,我相信您将体验到显着的性能提升。
并行工作应该更快,至少在多核机器上.试试这个C#代码.你将不得不翻译为VB.NET.
private static long DirSize(string sourceDir, bool recurse)
{
long size = 0;
string[] fileEntries = Directory.GetFiles(sourceDir);
foreach (string fileName in fileEntries)
{
Interlocked.Add(ref size, (new FileInfo(fileName)).Length);
}
if (recurse)
{
string[] subdirEntries = Directory.GetDirectories(sourceDir);
Parallel.For<long>(0, subdirEntries.Length, () => 0, (i, loop, subtotal) =>
{
if ((File.GetAttributes(subdirEntries[i]) & FileAttributes.ReparsePoint) != FileAttributes.ReparsePoint)
{
subtotal += DirSize(subdirEntries[i], true);
return subtotal;
}
return 0;
},
(x) => Interlocked.Add(ref size, x)
);
}
return size;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
12708 次 |
最近记录: |