2

非常に大きくなる可能性のあるフォルダーのサイズを計算しようとして、次を使用しました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 エクスプローラーは、十分な時間があれば常に結果を計算できるようです。

4

1 に答える 1

0

別のオプションは、pure-perl に固執することです: Filesys::DiskUsageはほぼ同じことを行います。ただし、許可の問題は残ると思います。少なくとも の出力をスクレイピングするよりも優れているはずですdir /s

正直なところ、管理者としてログインしていないときにエクスプローラーがこれらのディレクトリで動作する場合、それはエクスプローラーの権限昇格の問題のように思えます-明らかに、エクスプローラーは、管理者でなくても管理者であるかのようにファイルシステムにアクセスできますしたがって、Explorer によってロードされた独自の DLL を取得できる場合は、管理者アクセスも可能です。

于 2011-04-23T20:27:58.447 に答える