Rozmiar danych w koszu

0

Jak sprawdzić ile Mb danych znajduje się w koszu ? Z góry dziękuje za odpowiedź.

0

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.
0

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ść !! :)

0

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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1