c ++ - Få en fils størrelse gennem `IShellItem`

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har implementeret en mappestegningsalgoritme til Windows Shell ved hjælp af IShellItem, IShellFolder, IStorage, IStream osv. Alt er godt og godt. Jeg kan endda gå inde shell navneudvidelser (f.eks. .zip) filer.


Jeg har dog problemer med at udvinde (almindelige) filstørrelser, når filer bruges af et andet program med eksklusiv adgang.


AFAIK, der er intet andet end strukturen STATSTG, der giver mere information end filens navn. Der er i det væsentlige 3 måder at få fat på en STATSTG for en IShellItem:



  1. Iterér med IEnumSTATSTG i stedet for IEnumIDList. I stedet for at påberåbe IShellFolder::EnumObjects(), få IStorage til mappen og påkalde IStorage::EnumElements(). Du får nu STATSTG strukturer direkte.

  2. Hent IStorage til IShellItem og påberåbe IStorage::Stat().

  3. Hent IStream til IShellItem og påberåbe IStream::Stat().



Jeg vil virkelig gerne bruge # 1, fordi det ville give mig alle de oplysninger, jeg har brug for. Jeg kan dog ikke få det til at opregne mappeindhold. Jeg udtrækker IStorage for mappen med succes: den Stat() giver mig det rigtige mappenavn. Jeg udnytter IEnumSTATSTG, men det første opkald til Next(1, &item, NULL) vender tilbage S\_FALSE og afslutter opgørelsen.


Jeg ville falde tilbage for at bruge # 2, da det stadig ikke er så slemt, men at udvinde IStorage for almindelige diskfiler producerer en fejl, der bruger både IShellItem::BindToHandler(0, BHID\_Storage, ...) og IShellFolder::BindToStorage(child, ...).


Jeg forsøgte endelig # 3, selv om det bare sletter synes forkert, og det lykkes så længe filerne ikke bruges med eksklusiv adgang til et andet program.


Jeg har gået rundt lidt og fundet flere kodestykker, der bruger tilgang nr. 3.


Spørgsmål : Kan nogen forklare, hvordan jeg skulle få filens STATSTG uden at bruge tilgang nr. 3?


Skal tilgang # 1 arbejde, eller producerer IStorage -implementeringen til almindelige mapper simpelthen ikke lister? Skal tilgang # 2 arbejde eller er implementeringen IStorage simpelthen ikke implementeret til almindelige filer?


Miljø : Windows Vista Ultimate 32-bit, Visual Studio 2008 Express. Brug af C ++, ingen ATL, alle brugerdefinerede COM wrappers (internt, kan ændres hensigtsmæssigt under forudsætning af at der er noget der er galt der).

Bedste reference


Har du forsøgt at få fat i IShellItem2-grænsefladen og derefter spørge om værdien af ​​PKEY\_Size-ejendommen?

Andre referencer 1


Selv med det accepterede svar tog det nogle ting.


Den første ting du har brug for er Windows Egenskaber -reference. Derefter skal du vide, at du vil gå ind i System.Size . Derfra får du de to vigtige oplysninger: [35] [36]



  

System.Size


  
  Systemets leverede filsystem størrelse af varen, i bytes.

  
   shellPKey =PKEY\_Size

   typeInfo

  &Nbsp;           skriv =UInt64



At vide, at det er en UInt64, kan du så få fat i IShellItem2 grænsefladen for at bruge en af ​​de mange egenskabsmetoder: [37]


//Get the IShellItem2 interface out of the IShellItem object
IShellItem2 si2 = shellItem as IShellItem2;

//Get the file fize (in bytes)
UInt64 fileSize;
si2.GetUInt64(PKEY\_Size, ref fileSize);