| 
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
日時: 2021/03/18 10:17
名前: 魔界の仮面弁士
 
************************************************************************************ カテゴリー:[フォルダー][ファイル][ディレクトリ]
 * キーワード:ディレクトリ内のファイルの総容量,フォルダー内のファイルの総容量,ファイルサイズ,
 ***********************************************************************************
 元ネタ: http://hanatyan.sakura.ne.jp/dotnet/file07.htm
 
 下位のディレクトリを高速に走査できるよう、並列プログラミングとして組み込んでみました。
 アクセス権が無い場所はスキップされます。
 
 .NET 6.0 および .NET 5.0 で動作確認。
 
 Imports System
 Imports System.IO
 Imports System.Threading
 Imports System.Runtime.CompilerServices
 
 Public Module DirectoryInfoExtensions
 <Extension>
 Public Function GetDirectorySize(this As DirectoryInfo) As Long
 Dim directorySize = 0L
 If Not If(this?.Exists, False) Then
 Return directorySize
 End If
 Dim eo As New EnumerationOptions With {
 .AttributesToSkip = FileAttributes.ReparsePoint Or FileAttributes.Offline Or FileAttributes.Device,
 .IgnoreInaccessible = True,
 .RecurseSubdirectories = False,
 .ReturnSpecialDirectories = False
 }
 For Each fileInfo In this.EnumerateFiles("*", eo)
 Interlocked.Add(directorySize, fileInfo.Length)
 Next
 Parallel.ForEach(this.EnumerateDirectories("*", eo), Sub(d) Interlocked.Add(directorySize, GetDirectorySize(d)))
 Return directorySize
 End Function
 End Module
 
 Module Program
 Sub Main()
 Dim d As New DirectoryInfo("C:\Program Files")
 Console.WriteLine(d.FullName)
 Console.WriteLine($"{d.GetDirectorySize():N0} Bytes")
 Console.ReadKey()
 End Sub
 End Module
  |