windows - Hvordan kan jeg pålideligt bestemme mappestørrelse ved hjælp af FileSystemObject.Size?

Indlæg af Hanne Mølgaard Plasc

Problem



Forsøger at beregne størrelsen af ​​en mappe, der kan være meget stor, brugte jeg FileSystemObject.Size: [14]


#! 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;
}


I nogle tilfælde vender folder\_size normalt tilbage, men for andre kaster opkaldet til Size undtagelser. Beregner størrelserne på mapper i C: med


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
";
}


Jeg får følgende output:


C:$Recycle.Bin - Size C:$Recycle.Bin: The resource loader failed to find MUI file at olesize line 22.
C:oot - 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


Det ser ud til at være i det mindste delvist et tilladelsesproblem, fordi kørsel af koden som administrator ændrer noget af outputen (angivet med fed skrift).


C:$Recycle.Bin - 2062958143
C:oot - 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-fejlmeddelelsen svarer til ERROR\_MUI\_FILE\_NOT\_FOUND. [15]


Hvordan er min kode forkert?


For kontekst har jeg intet krav om at bruge FileSystemObject. Andre tilgange, jeg overvejede, skrabede udgangen af ​​dir /s og summere størrelserne på alle blade i undertræk. For store mapper kan udgangen af ​​dir /s være enorm, og skure en hel subtree er en performance hund. Windows Explorer synes altid at kunne beregne resultatet givet tilstrækkelig tid, så er der en måde at ringe til, hvad det gør?

Bedste reference


En anden mulighed er at holde fast i ren-perl: Filesys :: DiskUsage handler om det samme. Imidlertid vil jeg 'm betting that permission issues forblive. Det skal i det mindste være bedre end at skrabe output fra dir /s. [16]


For at være ærlig, hvis Explorer arbejder på disse mapper, når du ikke er logget ind som administrator, ser det ud som et privilegium eskaleringsproblem i Explorer til mig - tilsyneladende kan Explorer få adgang til filsystemet som om det var administrator selv når det ikke er ' t logget ind som sådan, så hvis du kan få din egen DLL indlæst af Explorer, kan du også have administratoradgang.