HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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.
      repeat
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;

Cikksorozat

#IDKategóriaCikk címeSorozat
1063DelphiInterbase 6 alkalmazása Delphi-ben1. rész
1072DelphiInterbase 6 alkalmazása Delphi-ben2. rész
1084DelphiInterbase 6 alkalmazása Delphi-ben3. rész
1092DelphiTIBTable komponens4. rész
1102DelphiTIBTransaction komponens5. rész
1111DelphiTIBQuery komponens6. rész
1120DelphiTIBStoredProc komponens7. rész
1128DelphiTIBDataSet komponens8. rész
1141DelphiTIBSQL komponens9. rész
1150DelphiTIBSQLMonitor komponens10. rész
1159DelphiTIBUpdateSQL komponens11. rész
1167DelphiIBEvents komponens12. rész
1177DelphiIBDatabaseInfo komponens használata13. rész
1183DelphiTIBConfigService komponens14. rész
1192DelphiTIBSecurityService komponens15. rész
1204DelphiTIBServerProperties komponens16. rész
1213DelphiTIBBackupService komponens17. rész
1222DelphiTIBRestoreService komponens18. rész
1231DelphiTIBValidationService komponens19. rész
1240DelphiTIBStatisticalService komponens20. rész
1249DelphiTIBLogService komponens21. rész
1258DelphiTIBUninstall komponens22. rész
1267DelphiInterBase Express komponenscsomag23. rész


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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |