2011-04-23 78 views
2

試圖計算可能是非常大的一個文件夾的大小,我用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資源管理器似乎總是能夠在給定足夠時間的情況下計算結果,那麼有沒有辦法調用它正在執行的任何操作?

+0

我懷疑Explorer只是忽略了例外。如果您嘗試使用Explorer測量出現異常的文件夾,會發生什麼情況? – cjm 2011-04-23 15:23:40

+0

@cjm Explorer對C:\ Program Files或C:\ Windows沒有任何問題:屬性表中的大小在30秒內落在答案上。用File :: Find來搜索目錄的深度至少需要5倍。 – 2011-04-23 16:26:52

回答

0

另一種選擇是堅持pure-perl:Filesys::DiskUsage也做同樣的事情。不過,我敢打賭,許可問題仍將存在。它至少應該比抓取dir /s的輸出更好。

說實話,如果Explorer沒有以管理員身份登錄這些目錄時,這對Explorer來說似乎是一個特權升級問題 - 顯然,Explorer可以像訪問管理員一樣訪問文件系統當它沒有以這種方式登錄時,所以如果你可以通過資源管理器加載你自己的DLL,你也可以擁有管理員訪問權限。

相關問題