HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Lemezkarbantartó komponens készítése


Példaprogram letöltése

5897 bájt

Mai cikkünkben a Windows lemezkarbantartó programjához hasonló komponenst fogunk készíteni, mellyel tárterületet szabadíthatunk fel. Mindehhez csak meg kell adnunk annak a meghajtónak a betűjelét, melyen a karbantartást szeretnénk elvégezni, valamint egy minimális tárterületet MB-okban, mely alá nem szeretnénk, hogy csökkenjen a szabad helyünk a lemezen. A komponensben beállítható, hogy az hol próbáljon helyet felszabadítani, mint például a Windows Temp könyvtára, az Internet Explorer ideiglenes fájljai, vagy a Lomtár. A munka végeztével kijelzi számunkra a felszabadított tárhely nagyságát.

Komponensünkben a különböző feladatok elvégzésére egy-egy függvényt készítettünk. Nézzük meg ezeket most sorban.
A felhasználónak meg kell adnia annak a meghajtónak a betűjelét, melyen a karbantartást el szeretné végezni. A további függvények is ezt a paramétert fogják felhasználni, így nagyon fontos annak a leellenőrzése, hogy valós adatot kaptunk-e. Ezért a GetDrives függvényünk segítségével lekérdezzük a számítógép összes meghajtójának a betűjelét. Ezután egyenként összehasonlítjuk azokat a Drive property-ben megadott értékkel, és ha valamelyik is egyezik közülük, akkor tovább folytathatjuk a program futását. Ellenkező esetben hibaüzenetet küldünk a felhasználó felé. Lássuk, hogyan is épül fel ez a függvény:
function TDiskCleaner.GetDrives:boolean;
var
  a: array[0..127] of char;
  i,l: integer;
  s: string;
begin
  Result:=False;
Az egyes meghajtók betűjelének a lekérdezéséhez a GetLogicalDriveStrings függvényt fogjuk segítségül hívni.
  l:=GetLogicalDriveStrings(128, a);
  s:='';
  for i:=0 to l-1 do begin
    case i mod 4 of
      0, 1, 2: s:=s+a[i];
      3: begin
Mivel az s változóban ’meghajtó:\’ formában kapjuk vissza az értékeket, ezért nekünk is át kell alakítanunk a Drive-ban beírt értéket ilyen formátumúra. Amennyiben találunk egyezőséget, a függvény igaz visszatérési értéket kap.
           if s=(UpperCase(FDrive[1])+':\') then
             Result:=True;
           s:='';
         end;
    end;
  end;
Ha nem létező meghajtót adtunk meg a komponensben, akkor hibaüzenetet kapunk.
  if Result=False then
    ShowMessage('Nincs ilyen betűjelű meghajtó!');
end;
Miután megbizonyosodtunk róla, hogy létező meghajtót kaptunk a Drive property-ben, tovább folytathatjuk a vizsgálatot, ezúttal a minimális szabad tárhely tekintetében. A komponens MinLimitMB változójában MB-okban kell megadnunk azt a minimális határt, mely alá nem szeretnénk, hogy tárhelyünk csökkenjen. Ezért le kell kérdeznünk az aktuális szabad lemezterületet a megadott meghajtón, majd összehasonlítanunk az általunk megadott értékkel. Ezt a CountSpaces függvénnyel végezzük, mely paraméterként a vizsgálandó meghajtó betűjelét várja. Ez rendelkezésünkre áll az FDrive property-ben.
function TDiskCleaner.CountSpaces(Disk:string):extended;
var diskstr : string;
    TotalFree, TotalSpace, FreeSpaceAvailable: Int64;
begin
  diskstr := disk + ':\';
A GetDiskFreeSpaceEx függvény a FreeSpaceAvailable paraméterében adja vissza a szabad tárterület méretét byte-okban. A függvény visszatérési értékének ezt a mennyiséget adjuk, MB-okra átváltva.
  GetDiskFreeSpaceEx(PChar(diskstr),FreeSpaceAvailable,TotalSpace,@TotalFree);
  Result:=FreeSpaceAvailable/1024/1000;
end;
A kapott eredményt összehasonlítjuk az FMinLimit property értékével, és ha az kisebb, akkor tovább folytatjuk a vizsgálatot.
A tárterület felszabadítására négyféle lehetőség áll a rendelkezésünkre. Ezekhez hozzárendeltünk egy-egy logikai változót, így azokat egyenként ki-be kapcsolhatjuk. Az első mód a hely felszabadítására, ha töröljük a Windows\Temp könyvtár tartalmát, mely ideiglenes fájlokat tartalmaz. Ezt a DeleteFiles függvénnyel tehetjük meg, mely egy maszkot és egy elérési útvonalat vár paraméterként. A maszkban a törlés típusát adhatjuk meg (pl. *.txt, *.*).
procedure TDiskCleaner.DeleteFiles(sMask, sPath: string);
var
  SearchRec: TSearchRec;
  Found: Integer;
begin
  if sPath[Length(sPath)]<>'\' then
    sPath := sPath+'\';
A kapott paraméterek alapján a FindFirst függvény a megadott elérési útvonalon megkeresi a maszknak megfelelően az összes állomány nevét, majd a DeleteFile függvénnyel ezeket kitöröljük.
  Found := SysUtils.FindFirst(sPath + sMask, faAnyFile, SearchRec);
  try
    while (Found = 0) do
    begin
      if not (SearchRec.Attr and faDirectory > 0) then
        SysUtils.DeleteFile(sPath + SearchRec.Name);
      Found := SysUtils.FindNext(SearchRec);
    end;
  finally
    SysUtils.FindClose(SearchRec);
  end;
end;
A fenti módszer esetén az állományok azonnal törlésre kerülnek, tehát nincs mód a későbbi helyreállításukra. Nemcsak a Windows, hanem az aktuális felhasználó is rendelkezik Temp könyvtárral. Ennek elérési útvonalát a GetCurrentUserTempPath nevű függvény fogja szolgáltatni.
function GetCurrentUserTempPath: string;
var
    Temp:array[0..Max_Path]of char;
begin
      GetTempPath(MAX_PATH,Temp);
      Result:=String(Temp);
end;
Ezután immár a teljes elérési útvonal tudatában újra az előbb ismertetett DeleteFiles függvényt hívjuk meg.
Amennyiben rendelkezünk Internet Explorer-el, az EmptyIETempFiles property engedélyezésével kitörölhetjük annak ideiglenes fájlokat tartalmazó könyvtárának tartalmát is. Ebben az Interneten való böngészésünk során letöltött weblapok, sütik és egyéb elemek kerülnek ideiglenes tárolásra, melyek igen sok helyet is elfoglalhatnak. A DeleteIECache függvénnyel azonban mindezt kitörölhetjük. Itt jegyeznénk meg, hogy azoknak a weblapoknak a működése megváltozhat, melyek sütiket helyeznek el a gépünkön. Így előfordulhat, hogy például nem ismer fel minket automatikusan egy olyan oldal, ahová korábban regisztráltuk magunkat. Ezért mindenki saját maga belátása szerint használja ezt a függvényt. Lássuk a felépítését:
procedure TDiskCleaner.DeleteIECache;
var
  lpEntryInfo: PInternetCacheEntryInfo;
  hCacheDir: LongWord;
  dwEntrySize: LongWord;
begin
  dwEntrySize := 0;
A FindFirstUrlCacheEntry függvénnyel megkeressük az IE ideiglenes fájljainak tárolási helyét.
  FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
  GetMem(lpEntryInfo, dwEntrySize);
  if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
  hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
  if hCacheDir <> 0 then
  begin
Egy ciklus segítségével sorban kitöröljük a benne található állományokat.
    repeat
      DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
      FreeMem(lpEntryInfo, dwEntrySize);
      dwEntrySize := 0;
      FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^), dwEntrySize);
      GetMem(lpEntryInfo, dwEntrySize);
      if dwEntrySize > 0 then lpEntryInfo^.dwStructSize := dwEntrySize;
    until not FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize);
  end;
Végül felszabadítjuk az erőforrásokat.
  FreeMem(lpEntryInfo, dwEntrySize);
  FindCloseUrlCache(hCacheDir);
end;
Komponensünk utolsó lehetőségként a Lomtár kiürítését ajánlja fel. Ezt az EmptyTrash függvény végzi el, mely a Shell32.Dll-ben található SHEmptyRecycleBinA függvényt fogja betölteni.
Procedure TDiskCleaner.EmptyTrash;
Const
  SHERB_NOCONFIRMATION = $00000001 ;
  SHERB_NOPROGRESSUI   = $00000002 ;
  SHERB_NOSOUND        = $00000004 ;
Type
  TSHEmptyRecycleBin = function (Wnd : HWND;
                                 pszRootPath : PChar;
                                 dwFlags : DWORD
                       ) : HRESULT; stdcall ;
Var
  SHEmptyRecycleBin : TSHEmptyRecycleBin;
  LibHandle         : THandle;
Begin
  LibHandle := LoadLibrary(PChar('Shell32.dll')) ;
  if LibHandle <> 0 then
     @SHEmptyRecycleBin := GetProcAddress(LibHandle, 'SHEmptyRecycleBinA')
  else
  begin
     MessageDlg('Failed to load Shell32.dll.', mtError, [mbOK], 0);
     Exit;
  end;
Amennyiben a függvény sikeresen betöltődött, beállítjuk, hogy az mindenféle figyelmeztetés és megerősítés nélkül törölje ki a Lomtárat. Ezt azért tesszük, mert komponensünk már küld egy figyelmeztetést, mielőtt lefuttatná ezt a függvényt.
  if @SHEmptyRecycleBin <> nil then
     SHEmptyRecycleBin(Application.Handle,
                       nil,
                       SHERB_NOCONFIRMATION or SHERB_NOPROGRESSUI or SHERB_NOSOUND);
  FreeLibrary(LibHandle);
  @SHEmptyRecycleBin := nil ;
end;
A komponens működése az Execute függvény futtatásával indítható, melyben a fent ismertetett függvényeket hívjuk meg, mindegyik előtt egy megerősítést kérve a törlésre. A függvények futásának befejeztével kiírjuk MB-okban a felszabadított lemezterület nagyságát.

Cikksorozat



Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 576. 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 |