|
|
Alkönyvtárban lévő állományok összméretének lekérdezése
|
|
Példaprogram letöltése
6120 bájt
|
Hogy egy könyvtár az összes alkönyvtárával és fájljaival együtt mennyi helyet foglal el a háttértáron, azt könnyen megnézhetjük, mondjuk a Windows Intézőben. Ha viszont programból szeretnénk ezt az információt megtudni, akkor már nehezebb dolgunk van. Mellékelt példában erre keresünk egyszerű megoldást.
A "dirsize.pas" fájl nem csupán a könyvtár méretének lekérdezésére alkalmas függvényt tartalmazza, hanem egy másikat is, ami egy adott könyvtárban található alkönyvtárak listáját olvassa be egy TStrings típusú változóba. A két függvényt nagyszerűen lehet használni együtt, ahogyan azt a mellékelt példaprogram is mutatja. Első lépésben a GetDirList függvénnyel beolvassuk egy könyvtár alkönyvtárait, majd a kapott listán végighaladva egyenként lekérdezzük a könyvtárak méretét a GetDirSize függvénnyel. Természetesen, ha csak egy könyvtár méretére vagyunk kíváncsiak, akkor elég a GetDirSize függvény használata is!
Nézzük először a GetDirList függvényt. Két paramétere van: az első a könyvtár neve, a második egy TStrings típusú változó, amiben a listát fogjuk tárolni, illetve visszaadni.
function GetDirList(dir: string; list:TStrings):boolean;
…
Csak akkor olvassuk be a könyvtárlistát, ha a list paraméter értéke nem nil. Ebben az esetben ugyanis nem lenne hova beolvasni a listát, és hibaüzenetet kapnánk.
if Assigned(list) then begin
Töröljük a listát, és ellenőrizzük, hogy a könyvtárnév "\" karakterre végződik-e. Ha nem, akkor ezt pótoljuk.
list.Clear;
if dir[length(dir)]<>'\' then dir:=dir+'\';
A FindFirst függvény segítségével beolvassuk az első fájl adatait. A függvény visszatérési értéke 0, ha a művelet sikerült.
if FindFirst(dir+'*.*', faAnyFile, F)=0 then begin
Egy ciklust indítunk, ami addig tart, amíg az összes fájl adatait be nem olvastuk.
Ellenőrizzük, hogy a beolvasott fájl könyvtár-e, és nem ponttal kezdődik-e. Ha mindkét feltétel megfelelő, akkor hozzáadjuk a listához.
if ((F.Attr and faDirectory)>0) and (F.Name[1]<>'.') then list.Append(dir+F.Name);
A ciklus végén beolvassuk a következő fájl adatait a FindNext függvénnyel. A függvény visszatérési értéke szintén 0, ha a művelet sikerült. Ha nem sikerült, akkor befejeződik a ciklus.
until FindNext(F)<>0;
end;
A függvény visszatérési értékét true-ra állítjuk, és a FindClose függvénnyel lezárjuk a keresést.
result:=true;
FindClose(F);
end;
end;
A GetDirSize függvény látszólag egyszerűbb, de mégsem az, mert ehhez még egy rekurzív eljárás is tartozik. A függvény visszatérési értéke a dir paraméterben megadott könyvtár mérete bájtokban. Maga a függvény a következőképpen néz ki:
function GetDirSize(dir: string):int64;
begin
FDirSize:=0;
ScanDirSize(dir);
result:=FDirSize;
end;
Első lépésben nullázzuk az FDirSize globális változót. Ebben a változóban számoljuk a könyvtárban, és annak alkönyvtáraiban található fájlok méretét.
Meghívjuk a ScanDirSize rekurzív eljárást a dir paraméterrel, ami a tényleges munkát fogja végezni.
A függvény visszatérési értéke az FDirSize változó értéke, ami mostanra már a könyvtár által lefoglalt helyet tartalmazza. Erről tudni kell, hogy ez a könyvtárban található fájlok méretével egyenlő, és nem a ténylegesen lefoglalt területtel!
Most nézzük meg a ScanDirSize eljárást, ami a könyvtárban található fájlok méretét összegzi.
procedure ScanDirSize(dir:string);
var F:TSearchRec;
begin
Ellenőrizzük, hogy a dir paraméter, ami a könyvtár nevét tartalmazza "\" karakterre végződik-e, és ha nem, akkor gondoskodunk arról, hogy így legyen.
if dir[length(dir)]<>'\' then dir:=dir+'\';
A FindFirst függvénnyel beolvassuk az első fájl adatait.
if FindFirst(dir+'*.*', faAnyFile, F)=0 then begin
repeat
Ha a beolvasott fájl egy könyvtár, akkor ellenőrizzük, hogy nem ponttal kezdődik-e. Ha nem, akkor az eljárás rekurzívan meghívja saját magát paraméterként megadva a most beolvasott könyvtár nevét. Ha a beolvasott fájl nem könyvtár, akkor az F változóból kiolvassuk annak méretét, és hozzáadjuk az FDirSize globális változóhoz. Az egész műveletet addig folytatjuk, amíg van beolvasandó fájl. Mire az összes fájl adatait beolvastuk, addigra az FDirSize változó a fájlok összesített méretét tartalmazza.
if (F.Attr and faDirectory)>0 then begin
if F.Name[1]<>'.' then ScanDirSize(dir+F.Name)
end else begin
Inc(FDirSize, F.Size);
end;
until FindNext(F)<>0;
end;
FindClose(F);
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 436. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|