Jak sprawdzić ile Mb danych znajduje się w koszu ? Z góry dziękuje za odpowiedź.
Natworzyłem kiedyś coś takiego: Form1 oraz dwa przyciski Button1, Button2. Po naciśnięciu pierwszego, jego tekst pokazuje rozmiar kosza na okreslonym dysku, drugi opróżnia kosz.
Uważaj z jedną rzeczą: jak chcesz zbadać wszystkie dyski razem, to ścieżka ma być pustym tekstem: '', ale nie NULL (to nie to samo); jak konkretny dysk, to ścieżka do dowolnego pliku na tym dysku pozwala na odczytanie.
Nie jest to może szczególnie odkrywcze, bo bazuje bezpośrednio na MSDN.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellAPI, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
//===== ShellAPI =====
const
SHERB_NOCONFIRMATION = $00000001;
SHERB_NOPROGRESSUI = $00000002;
SHERB_NOSOUND = $00000004;
type
SHQueryRBInfo = packed record
cbSize :DWORD;
i64Size :int64;
i64NumItems :int64;
end;
pSHQueryRBInfo = ^SHQueryRBInfo;
function SHQueryRecycleBin(pszRootPath:pChar; pSHQueryRBInfo:pSHQueryRBInfo):HResult; stdcall; external 'SHELL32.DLL' name 'SHQueryRecycleBinA';
function SHEmptyRecycleBin(Wnd:hWnd; pszRootPath:pChar; dwFlags:DWord):Integer; stdcall; external 'SHELL32.DLL' name 'SHEmptyRecycleBinA';
//====================
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
info: SHQueryRBInfo;
begin
info.cbSize:=sizeof(info);
SHQueryRecycleBin('', @info);
Button1.Caption:=inttostr(info.i64NumItems);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SHEmptyRecycleBin(Form1.Handle, '', SHERB_NOCONFIRMATION or SHERB_NOPROGRESSUI or SHERB_NOSOUND);
end;
end.
Powyższy kod jest dobry, ale nie jest idealny ponieważ pobieranie danych jest niedokładne:
- liczy tylko obiekty (pliki w folderze w koszu są brane jako 1 plik)
- liczy tylko rozmiar plików bez folderów z plikami
Oto mój przykład :)
- pokazuje ile jest plików i jakie to pliki oraz ich rozmiar
function IsSlash(const sText: String) : String;
begin
{ sprawdzenie, czy na koncu jest znak \ }
if sText[Length(sText)] <> '\' then
Result := sText + '\' else Result := sText;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
SR: TSearchRec;
Found, LiczbaPlikow : Integer;
SizeKosz : Int64;
begin
ListBox.Clear;
SizeKosz := 0;
LiczbaPlikow := 0;
Found := FindFirst(IsSlash('C:\RECYCLED\') + '*.*', faAnyFile, SR);
while (Found = 0) do
begin
SizeKosz := SizeKosz + (SR.Size);
LiczbaPlikow := LiczbaPlikow + 1;
if ((SR.Name <> '.') and (SR.Name <> '..') {and (SR.Name <> 'desktop.ini')}) then
ListBox.Items.Add(SR.Name);
Found := FindNext(SR); // szukaj dalej
end;
FindClose(SR);
Label1.Caption := 'Rozmiar: ' + inttostr(SizeKosz div 1024) + ' KB';
Label2.Caption := 'Plików: ' + inttostr(LiczbaPlikow);
end;
100% skuteczność !! :)
100% skuteczność? :/ chyba nie, bo ta funkcja sprawdza tylko katalog C:\Recycled. A jak ktoś ma więcej dysków? To też trzeba zliczać bo każdy dysk ma praktycznie własny kosz :)