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.