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

Процедура вычисления размера каталога

Delphi , Файловая система , Директории



Автор: Panov
WEB-сайт: http://delphibase.endimus.com

{ **** UBPFD *********** by delphibase.endimus.com ****
>> 
Вычисляет размер файлов в каталоге и подкаталогах,
использую функции FindFirst/FindNext/FindClose

Зависимости: Masks;
Автор:       panov, panov@hotbox.ru
Copyright:   Нет
Дата:        30 марта 2004 г.
***************************************************** }

procedure GetDirSize(const aPath: string; var SizeDir: Int64);
var
  SR: TSearchRec;
  tPath: string;
begin
  tPath := IncludeTrailingBackSlash(aPath);
  if FindFirst(tPath + '*.*', faAnyFile, SR) = 0 then
  begin
    try
      repeat
        if (SR.Name = '.') or (SR.Name = '..') then
          Continue;
        if (SR.Attr and faDirectory) <> 0 then
        begin
          GetDirSize(tPath + SR.Name, SizeDir);
          Continue;
        end;
        SizeDir := SizeDir +
          (SR.FindData.nFileSizeHigh shl 32) +
          SR.FindData.nFileSizeLow;
      until FindNext(SR) <> 0;
    finally
      Sysutils.FindClose(SR);
    end;
  end;
end;

Пример использования:

procedure TForm1.Button1Click(Sender: TObject);
var
  SizeDir: Int64;
begin
  SizeDir := 0;
  GetDirSize('c:\winnt', SizeDir);
  ShowMessage('Размер каталога ' + IntToStr(SizeDir));
end;

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

Это процедура Delphi, называемая GetDirSize, которая рассчитывает размер директории и ее поддиректорий. Она использует функции FindFirst, FindNext и FindClose для обхода дерева директорий.

Вот разбивка кода:

  1. Процедура принимает два параметра: aPath, который является путем к директории, и SizeDir, которая будет хранить рассчитанный размер.
  2. Процедура сначала включает в переменную tPath символ обратной косой черты, используя функцию IncludeTrailingBackSlash.
  3. Затем она использует FindFirst для поиска первого файла в директории, соответствующего шаблону *.*. Если файлов не найдено, она возвращает код ошибки 0.
  4. Процедура затем вступает в цикл, который продолжается до тех пор, пока все файлы не будут обработаны или не произойдет ошибка. В каждом шаге цикла она проверяет, является ли текущий файл директории (используя свойство Attr и сравнивая его с faDirectory). Если это так, она рекурсивно вызывает себя с поддиректорией как новым путем.
  5. Если файл не является директории, она рассчитывает его размер, добавляя размер файла в байтах к общему размеру (SizeDir). Размер файла получается из записи FindData используя свойства nFileSizeHigh и nFileSizeLow.
  6. Наконец, когда все файлы будут обработаны, процедура закрывает поиск handle с помощью FindClose.

Пример использования показывает, как вызывать эту процедуру из обработчика события нажатия кнопки на форме. Процедура GetDirSize вызывается с путем 'c:\winnt', и рассчитанный размер отображается в сообщении.

Обратите внимание:

  • Код предполагает, что директория существует и пользователь имеет разрешение на чтение ее содержимого.
  • Код использует тип Int64 для хранения размера файла, который может обрабатывать большие размеры (до 2^63-1 байт).
  • Код не обрабатывает ошибки хорошо; если произойдет ошибка при поиске или расчете размера директории, она будет распространяться и завершать программу.

Альтернативное решение может быть использование класса TDirectory из RTL Delphi, который предоставляет более удобный способ обхода файлов и директорий. Вот пример:

procedure GetDirSize(const aPath: string; var SizeDir: Int64);
var
  dir: TDirectory;
begin
  dir := TDirectory.Create(aPath);
  try
    SizeDir := 0;
    for file in dir.GetFiles do
      SizeDir := SizeDir + file.Size;
    for subDir in dir.GetSubDirs do
      GetDirSize(subDir, SizeDir);
  finally
    dir.Free;
  end;
end;

Код использует класс TDirectory для создания объекта директории и обхода ее файлов и поддиректорий. Он рассчитывает размер каждого файла, добавляя его свойство Size к общему размеру (SizeDir). Рекурсивный вызов производится с помощью метода GetSubDirs, который возвращает перечисление поддиректорией.

Обратите внимание, что это код предполагает, что директория существует и пользователь имеет разрешение на чтение ее содержимого. Он также не обрабатывает ошибки хорошо; если произойдет ошибка при обходе или расчете размера директории, она будет распространяться и завершать программу.

Процедура вычисления размера каталога с помощью функций FindFirst, FindNext и FindClose позволяет узнать суммарный размер файлов в указанном каталоге и всех его подкаталогах.


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

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




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


:: Главная :: Директории ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-19 01:37:10/0.0035429000854492/0