非常に大きくなる可能性のあるフォルダーのサイズを計算しようとして、次を使用しましたFileSystemObject.Size
。
#! perl
use strict;
use warnings;
use 5.10.0;
use File::Spec;
use Win32::OLE;
my $_fso;
sub folder_size {
my($folder) = @_;
$_fso = Win32::OLE->new("Scripting.FileSystemObject")
unless defined $_fso;
die "GetFolder $folder: $^E"
unless defined(my $f = $_fso->GetFolder($folder));
my $size = $f->Size;
die "Size $folder: $^E" unless defined $size;
$size;
}
folder_size
正常に戻る場合もあれば、への呼び出しSize
が例外をスローする場合もあります。でフォルダのサイズを計算C:\
する
my $root = "C:/";
opendir my $dh, $root or die "$0: opendir: $!";
while (defined(my $name = readdir $dh)) {
next if $name eq "." || $name eq "..";
my $folder = File::Spec->catdir($root, $name);
next unless -d $folder;
chomp(my $size = eval { folder_size $folder } // $@);
print "$folder - $size\n";
}
次の出力が得られます。
C:\$Recycle.Bin - サイズ C:\$Recycle.Bin: リソース ローダーは、olesize 行 22 で MUI ファイルを見つけることができませんでした。 C:\ブート - 17463020 C:\cygwin - 1835711453 C:\デル - 133184282 C:\doctemp - 12811140 C:\Documents and Settings - Size C:\Documents and Settings: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\ドライバー - 180746384 C:\ 日食 - 324690795 C:\EFI-262144 C:\found.000 - サイズ C:\found.000: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\ghc - 1014658071 C:\gtk2hs - 138050118 C:\PerfLogs - サイズ C:\PerfLogs: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\Perl - 115648300 C:\Program Files - Size C:\Program Files: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\ProgramData - サイズ C:\ProgramData: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\Python25 - 83902423 C:\System Volume Information - Size C:\System Volume Information: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\Users - サイズ C:\Users: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\仮想マシン - 5401825804 C:\Windows - サイズ C:\Windows: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\xampp - 408475320
コードを管理者として実行すると出力の一部が変更されるため (太字で示されています)、少なくとも部分的にはアクセス許可の問題のようです。
C:\$Recycle.Bin - 2062958143 C:\ブート - 17463020 C:\cygwin - 1835711453 C:\デル - 133184282 C:\doctemp - 12811140 C:\Documents and Settings - サイズ C:\Documents and Settings: リソース ローダーは、olesize 行 22 で MUI ファイルを見つけられませんでした。 C:\ドライバー - 180746384 C:\ 日食 - 324690795 C:\EFI-262144 C:\found.000 - 8950 C:\ghc - 1014658071 C:\gtk2hs - 138050118 C:\パフォーマンス ログ - 0 C:\Perl - 115648300 C:\Program ファイル - 10857194364 C:\ProgramData - サイズ C:\ProgramData: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\Python25 - 83902423 C:\System Volume Information - Size C:\System Volume Information: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\Users - サイズ C:\Users: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\仮想マシン - 5401825804 C:\Windows - サイズ C:\Windows: リソース ローダー キャッシュには、olesize 行 22 で MUI エントリが読み込まれていません。 C:\xampp - 408475320
MUI エラー メッセージは に対応しERROR_MUI_FILE_NOT_FOUND
ます。
私のコードはどのように間違っていますか?
コンテキストについては、使用する必要はありませんFileSystemObject
。私が検討した他のアプローチは、出力をスクレイピングdir /s
し、サブツリー内のすべての葉のサイズを合計することでした。大きなディレクトリの場合、 の出力はdir /s
膨大になる可能性があり、サブツリー全体を精査するのはパフォーマンス ドッグです。Windows エクスプローラーは、十分な時間があれば常に結果を計算できるようです。