Windows - Fájl- és mappatömörítés programból

WMI 15. rész

forráskód letöltése
NTFS fájlrendszeren fájlokat, mappákat vagy a teljes kötetet valós időben tömöríthetjük. Mit jelent ez? Azt, hogy a fájl létrehozásakor tömörítve íródik a merevlemezre és használatkor automatikusan kicsomagolódik. Elvileg a felhasználó az egészből nem érzékel semmit. Sok fájlműveletnél előállhat némi teljesítménycsökkenés, de egy átlagos irodai munka során nem észrevehető. Cikkünkben röviden ismertetjük a módszer használatát a grafikus felület nyújtotta lehetőségekkel, majd konkrét példákon keresztül a programból történő megvalósításra térünk át.
Cikkünkhöz mellékeltük az alábbiakban szereplő szkripteket:
"Compressed.vbs" - Eldönti az F:\TEMP mappáról, hogy tömörítve van-e?
"Compress.vbs" - Tömöríti az F:\TEMP mappa teljes tartalmát.
"UnCompress.vbs" - Kicsomagolja az F:\TEMP mappa teljes tartalmát.
Felhasználási szempontból fontos, hogy mindhárom esetben változtassuk meg az F:\TEMP elérési utat egy létező mappára mutatva.
Fájlok és/vagy mappák tömörítése
Fontos, hogy az alábbiakban ismertetésre kerülő beállítások kizárólag NTFS fájlrendszerre formázott köteteken érhetők el, FAT vagy FAT32 alatt egyszerűen hiányoznak a megvalósítást végző komponensek. Indítsuk el a Windows Intézőt (Windows Explorer) és kattintsunk az egyik fájlra vagy mappára a jobboldali egérgombbal. A megjelenő menüben lépjünk a "Tulajdonságok" ("Properties") sorra elindítva ezzel a tulajdonságszerkesztő ablakot. Kattintsunk az "Általános" ("General") oldal "Attribútumok" ("Attributes") beállításcsoportjában található "Speciális" ("Advanced") gombjára. Ha bekapcsoljuk a "Tartalom tömörítése helymegtakarítás végett" ("Compress contents to save disk space") jelölőnégyzetet a rendszer elvégzi az adott fájl, fájlok vagy mappák tömörítését. Mappa esetében - amennyiben tartalmaz legalább egy almappát - egy további kérdés során kell eldönteni, hogy a tömörítés kiterjedjen-e ezekre is. Ezt követően a rendszer elvégzi a tömörítést, amely mennyiségtől és a számítógép hardverétől függően (főleg a processzor és a memória paraméterei döntőek) hosszabb - rövidebb ideig tart. A művelet végeztével ugyanúgy használhatjuk az állományokat, mint előtte. Ha egy teljes kötetet akarunk tömöríteni, akkor kattintsunk az Intézőben (Explorer) a meghajtó betűjelére a jobboldali egérgombbal, lépjünk a "Tulajdonságok" ("Properties") menüre és aktivizáljuk a "Meghajtó tömörítése helymegtakarítás végett" ("Compress drive to save disk space") jelölőnégyzetet.
Amennyiben meggondoltuk magunkat és még sincs szükségünk tömörítésre, egyszerűen töröljük a pipát az előbbi jelölőnégyzetekből.
Tömörített állományok megjelenítése más színnel
Honnan lehet megtudni, hogy egy fájl vagy mappa tömörítve van-e? Vagy megnézzük a fenti jelölőnégyzetek állapotát vagy beállítjuk, hogy az Intézőben eleve más színnel jelenjenek meg. Utóbbihoz az alábbi jelölőnégyzetet kell bekapcsolni.
Windows XP alatt (alapértelmezésben be van kapcsolva):
Vezérlőpult > (Megjelenés és témák) > Mappa beállításai > Nézet > Titkosított és tömörített NTFS-fájlok megjelenítése színekkel (Control Panel > (Appearance and Themes) > Folder Options > View > Show encrypted or compressed NTFS files in color).
Windows 2000 alatt:
Vezérlőpult > Mappabeállítások > Nézet > Tömörített fájlok kijelzése más színnel (Control Panel > Folder Options > View > Display compressed files and folders with alternate color).
Térjünk át a programból való megvalósítás mikéntjére. Példáinkban VB szkipteket fogunk használni, de más nyelvekből is elérhetők a szükséges metódusok. A Windows Management Instrumentation (WMI) szolgáltatás "Win32_Directory" osztályához kell fordulnunk segítségért.
Tömörített egy állomány vagy nem?
Az osztály "Compressed" tulajdonsága tárolja kérdésünkre a választ. Amennyiben a visszakapott érték -1, akkor a mappa tömörített, ha 0, akkor nem. Cikksorozatunk korábbi részeiben számos alkalommal készítettünk olyan WQL lekérdezéseket, amelyekkel egy vagy több tulajdonságot olvastunk. Most sem lesz ez másként, de egy apró különbség azért van: valamilyen módon meg kell adnunk, hogy melyik fájlra vagy mappára vagyunk kíváncsiak. Az osztály "Name" tulajdonsága tárol egy elérési utat, öröklődés útján logikai kapcsolatot kialakítva a fájlrendszerrel. Például az F:\TEMP könyvtár a következőképpen érhető el.
Set CompSet = GetObject ("winmgmts: {impersonationLevel = impersonate}").ExecQuery ("select * from Win32_Directory where Name='F:\\temp'")
A dupla "\" jel nem véletlen, ugyanis ez az elérési utak megadásának szabályos módja a WMI-ban. Ha elhagyjuk az útvonal meghatározást a teljes C:\ kötet kerül tömörítésre. Ezután ellenőrizzük le a visszakapott objektumpéldányok "Compressed" tulajdonságát és tartalmától függően jelenítsünk meg egy szöveget.
for each Comp in CompSet
 if Comp.Compressed=-1 then Wscript.Echo "A mappa tömörített."
 if Comp.Compressed=0 then Wscript.Echo "A mappa nem tömörített."
next
Mappák és fájlok tömörítése
Következő szkriptünk első sora megegyezik az előzővel. Szintén a "Win32_Directory" osztályra lesz szükségünk és maradjunk az F:\TEMP mappa példájánál.
Set CompSet = GetObject ("winmgmts: {impersonationLevel = impersonate}").ExecQuery ("select * from Win32_Directory where Name='F:\\temp'")
Továbbiakban azonban nem tulajdonságokat kell állítani, hanem a "Compress" metódust kell meghívni.
for each Comp in CompSet
   Return=Comp.Compress
next
A szkript futtatásakor végrehajtódik az F:\TEMP mappa teljes tartalmának - beleértve az almappákat is - tömörítése.
Mappák és fájlok kicsomagolása
Az előzőleg tömörített állományokat kicsomagolni az "UnCompress" metódussal lehet. Minden más megegyezik a tömörítésnél alkalmazott megoldásokkal.
Set CompSet = GetObject ("winmgmts: {impersonationLevel = impersonate}").ExecQuery ("select * from Win32_Directory where Name='F:\\temp'")
for each Comp in CompSet
   Return=Comp.UnCompress
next
A fenti szkriptekkel történő megvalósítás hátránya, hogy önálló fájlok esetében nem alkalmazható csak mappával együtt. Továbbá nem hagyható ki az almappák becsomagolása sem.

WMI cikksorozat