試圖計算可能是非常大的一個文件夾的大小,我用FileSystemObject.Size
:如何使用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
拋出異常。與
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 } // [email protected]);
print "$folder - $size\n";
}
我得到以下輸出計算在C:\
文件夾的大小:
C:\$Recycle.Bin - Size C:\$Recycle.Bin: The resource loader failed to find MUI file at olesize line 22. C:\boot - 17463020 C:\cygwin - 1835711453 C:\DELL - 133184282 C:\doctemp - 12811140 C:\Documents and Settings - Size C:\Documents and Settings: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Drivers - 180746384 C:\eclipse - 324690795 C:\EFI - 262144 C:\found.000 - Size C:\found.000: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\ghc - 1014658071 C:\gtk2hs - 138050118 C:\PerfLogs - Size C:\PerfLogs: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Perl - 115648300 C:\Program Files - Size C:\Program Files: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\ProgramData - Size C:\ProgramData: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Python25 - 83902423 C:\System Volume Information - Size C:\System Volume Information: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Users - Size C:\Users: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Virtual Machines - 5401825804 C:\Windows - Size C:\Windows: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\xampp - 408475320
這似乎是至少部分權限問題,因爲運行的代碼作爲管理員更改某些輸出(以粗體標出)。
C:\$Recycle.Bin - 2062958143 C:\boot - 17463020 C:\cygwin - 1835711453 C:\DELL - 133184282 C:\doctemp - 12811140 C:\Documents and Settings - Size C:\Documents and Settings: The resource loader failed to find MUI file at olesize line 22. C:\Drivers - 180746384 C:\eclipse - 324690795 C:\EFI - 262144 C:\found.000 - 8950 C:\ghc - 1014658071 C:\gtk2hs - 138050118 C:\PerfLogs - 0 C:\Perl - 115648300 C:\Program Files - 10857194364 C:\ProgramData - Size C:\ProgramData: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Python25 - 83902423 C:\System Volume Information - Size C:\System Volume Information: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Users - Size C:\Users: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\Virtual Machines - 5401825804 C:\Windows - Size C:\Windows: The resource loader cache doesn't have loaded MUI entry at olesize line 22. C:\xampp - 408475320
MUI錯誤消息對應於ERROR_MUI_FILE_NOT_FOUND
。
我的代碼是不正確的?
對於上下文,我沒有要求使用FileSystemObject
。我考慮過的其他方法是刪除dir /s
的輸出並將子樹中所有葉子的大小相加。對於大型目錄,dir /s
的輸出可能是巨大的,並且沖刷整個子樹是性能狗。 Windows資源管理器似乎總是能夠在給定足夠時間的情況下計算結果,那麼有沒有辦法調用它正在執行的任何操作?
我懷疑Explorer只是忽略了例外。如果您嘗試使用Explorer測量出現異常的文件夾,會發生什麼情況? – cjm 2011-04-23 15:23:40
@cjm Explorer對C:\ Program Files或C:\ Windows沒有任何問題:屬性表中的大小在30秒內落在答案上。用File :: Find來搜索目錄的深度至少需要5倍。 – 2011-04-23 16:26:52