Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Получить количество файлов в корзине и их общий размер

Delphi , Файловая система , Корзина

Получить количество файлов в корзине и их общий размер

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

type
   PSHQueryRBInfo = ^TSHQueryRBInfo;
   TSHQueryRBInfo = packed record
     cbSize: DWORD;
     // Size of the structure, in bytes. 
    // This member must be filled in prior to calling the function. 
    i64Size: Int64;
     // Total size of all the objects in the specified Recycle Bin, in bytes. 
    i64NumItems: Int64;
     // Total number of items in the specified Recycle Bin. 
  end;

 const
   shell32 = 'shell32.dll';

 function SHQueryRecycleBin(szRootPath: PChar; SHQueryRBInfo: PSHQueryRBInfo): HResult;
   stdcall; external shell32 Name 'SHQueryRecycleBinA';

 function GetDllVersion(FileName: string): Integer;
 var
   InfoSize, Wnd: DWORD;
   VerBuf: Pointer;
   FI: PVSFixedFileInfo;
   VerSize: DWORD;
 begin
   Result   := 0;
   InfoSize := GetFileVersionInfoSize(PChar(FileName), Wnd);
   if InfoSize <> 0 then
   begin
     GetMem(VerBuf, InfoSize);
     try
       if GetFileVersionInfo(PChar(FileName), Wnd, InfoSize, VerBuf) then
         if VerQueryValue(VerBuf, '\', Pointer(FI), VerSize) then
           Result := FI.dwFileVersionMS;
     finally
       FreeMem(VerBuf);
     end;
   end;
 end;

 procedure TForm1.Button1Click(Sender: TObject);
 var
   DllVersion: integer;
   SHQueryRBInfo: TSHQueryRBInfo;
   r: HResult;
 begin
   DllVersion := GetDllVersion(PChar(shell32));
   if DllVersion >= $00040048 then
   begin
     FillChar(SHQueryRBInfo, SizeOf(TSHQueryRBInfo), #0);
     SHQueryRBInfo.cbSize := SizeOf(TSHQueryRBInfo);
     R := SHQueryRecycleBin(nil, @SHQueryRBInfo);
     if r = s_OK then
     begin
       label1.Caption := Format('Size:%d Items:%d',
         [SHQueryRBInfo.i64Size, SHQueryRBInfo.i64NumItems]);
     end
     else
       label1.Caption := Format('Err:%x', [r]);
   end;
 end;

 { 

The SHQueryRecycleBin API used in this method is 
only available on systems with the latest shell32.dll installed with IE4 / 
Active Desktop. 

}

Перевод контента на русский язык:

Этот код-snippet на Delphi предлагает процедуру для получения общего количества файлов и их суммарного размера в корзине. Вот объяснение, как это работает:

  1. Определен структура TSHQueryRBInfo, которая содержит два целочисленных поля: i64Size (общий размер всех объектов в корзине) и i64NumItems (общее количество элементов в корзине).
  2. Константа shell32 указывает на местоположение библиотеки shell32.dll.
  3. Функция SHQueryRecycleBin вызывается, которая запрашивает информацию о корзине. Она принимает два параметра: szRootPath (нулл-терминированная строка, содержащая корневой путь корзины) и SHQueryRBInfo (указатель на структуру TSHQueryRBInfo).
  4. Функция GetDllVersion используется для проверки версии библиотеки shell32.dll. Если она имеет версию, не менее IE4/Active Desktop совместимой (версия 4.48), то код продолжается.
  5. В процедуре Button1Click, функция SHQueryRecycleBin вызывается с нулевым указателем для szRootPath, и результаты хранятся в структуре SHQueryRBInfo.
  6. Если вызов SHQueryRecycleBin возвращает успешно (r = s_OK), то код форматирует строку, отображающую общий размер файлов в байтах и количество элементов (файлов) в корзине, и присваивает ее свойству label1.Caption. В противном случае, он отображает сообщение об ошибке с результатом.

Комментарий в конце предупреждает, что эта API доступна только на системах с установленным IE4/Active Desktop.

Вот предложенная альтернативная решение:

Вместо проверки версии shell32.dll можно использовать более надежный метод для проверки наличия необходимых функций. Можно также рассмотреть использование других API или библиотек, которые предоставляют схожую функциональность и совместимы с старыми системами.

Например, можно использовать интерфейс IRecycleBin из Windows API (доступен с Windows XP) для запрашивания информации о корзине. Это позволит вашему коду работать на более широком диапазоне систем.

Вот пример, как вы можете модифицировать код для использования интерфейса IRecycleBin:

uses
  ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
  rb: IRecycleBin;
  size: Int64;
  count: Int64;
begin
  rb := CreateOLEObject('Shell.Application').RecycleBin;
  if Assigned(rb) then
  begin
    size := rb.GetSize;
    count := rb.GetCount;
    label1.Caption := Format('Size:%d Items:%d', [size, count]);
  end
  else
    label1.Caption := 'Error: Unable to access Recycle Bin';
end;

Замечание, что это код требует использования единицы ComObj и использует позднюю связь для создания экземпляра COM-объекта Shell.Application. Интерфейс IRecycleBin затем используется для запрашивания информации о корзине.

Получение количества файлов в корзине и их общего размера на компьютере с помощью функции SHQueryRecycleBin из библиотеки shell32.dll.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Корзина ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-04-26 16:01:48/0.0032467842102051/0