フォルダのサイズを返すFunction

フォルダのサイズを返すFunction

フォルダのサイズを返すFunctionを作ってみた。

FileSystemObjectを使う

だいぶ前に、Twitterノンプロ研の某氏が言っていたのを思い出した。

たしかに、Windowsエクスプローラーでフォルダを右クリックして「プロパティ」を表示しても、フォルダのサイズはわからなくはないのだが、ファイル数が多いときに異様に時間がかかる。

FileSystemObjectを使えば一瞬なのだ。

作ったコード

ちょっとだけ工夫をして、次のようなコードにした。

リスト1
Option Explicit

Public Enum FiUnit
  fiByte
  fiKiloByte
  fiMegaByte
  fiGigaByte
  fiTeraByte
End Enum

Dim fsObj As Object

Public Function GetFolderSize( _
            ByVal a_FolderPath As String, _
   Optional ByVal a_Unit As FiUnit = fiByte) As Variant
  Dim ret As Variant
  ret = 0
  If fsObj Is Nothing Then Set fsObj = CreateObject("Scripting.FileSystemObject")
  Dim tgtFolder As Object
  'パス間違いだったら-1を返してExit'
  If Not fsObj.FolderExists(a_FolderPath) Then ret = -1: GoTo ReturnValue
  Set tgtFolder = fsObj.GetFolder(a_FolderPath)
  ret = tgtFolder.Size
  ret = ret / (1024 ^ a_Unit) '……(*)'
ReturnValue:
  GetFolderSize = ret
End Function

第2引数で、自作の列挙体を指定できるようにした。

んで、たとえばfiKiloByteが渡されたら、fiKiloByteの実体は2なので、Scripting.FolderオブジェクトのSizeプロパティが返した値を1024 ^ 2で割ることになり、キロバイト単位になる。

使ってみる

このFunctionを使って、私のSSD内のMETALLICAフォルダのサイズを表示してみた。

Byte単位とGigaByte単位で表示させてみた結果が、

f:id:akashi_keirin:20210723194740p:plain

これ。(英語が変だったら教えろえてください。)

エクスプローラの「プロパティ」で表示させてみた結果は、

f:id:akashi_keirin:20210723194748p:plain

これ。

当たり前だけど、完全一致。

おわりに

FileSystemObjectって、便利だね。