{ **** 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 thenbegintryrepeatif (SR.Name = '.') or (SR.Name = '..') then
Continue;
if (SR.Attr and faDirectory) <> 0 thenbegin
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 для обхода дерева директорий.
Вот разбивка кода:
Процедура принимает два параметра: aPath, который является путем к директории, и SizeDir, которая будет хранить рассчитанный размер.
Процедура сначала включает в переменную tPath символ обратной косой черты, используя функцию IncludeTrailingBackSlash.
Затем она использует FindFirst для поиска первого файла в директории, соответствующего шаблону *.*. Если файлов не найдено, она возвращает код ошибки 0.
Процедура затем вступает в цикл, который продолжается до тех пор, пока все файлы не будут обработаны или не произойдет ошибка. В каждом шаге цикла она проверяет, является ли текущий файл директории (используя свойство Attr и сравнивая его с faDirectory). Если это так, она рекурсивно вызывает себя с поддиректорией как новым путем.
Если файл не является директории, она рассчитывает его размер, добавляя размер файла в байтах к общему размеру (SizeDir). Размер файла получается из записи FindData используя свойства nFileSizeHigh и nFileSizeLow.
Наконец, когда все файлы будут обработаны, процедура закрывает поиск handle с помощью FindClose.
Пример использования показывает, как вызывать эту процедуру из обработчика события нажатия кнопки на форме. Процедура GetDirSize вызывается с путем 'c:\winnt', и рассчитанный размер отображается в сообщении.
Обратите внимание:
Код предполагает, что директория существует и пользователь имеет разрешение на чтение ее содержимого.
Код использует тип Int64 для хранения размера файла, который может обрабатывать большие размеры (до 2^63-1 байт).
Код не обрабатывает ошибки хорошо; если произойдет ошибка при поиске или расчете размера директории, она будет распространяться и завершать программу.
Альтернативное решение может быть использование класса TDirectory из RTL Delphi, который предоставляет более удобный способ обхода файлов и директорий. Вот пример:
Код использует класс TDirectory для создания объекта директории и обхода ее файлов и поддиректорий. Он рассчитывает размер каждого файла, добавляя его свойство Size к общему размеру (SizeDir). Рекурсивный вызов производится с помощью метода GetSubDirs, который возвращает перечисление поддиректорией.
Обратите внимание, что это код предполагает, что директория существует и пользователь имеет разрешение на чтение ее содержимого. Он также не обрабатывает ошибки хорошо; если произойдет ошибка при обходе или расчете размера директории, она будет распространяться и завершать программу.
Процедура вычисления размера каталога с помощью функций FindFirst, FindNext и FindClose позволяет узнать суммарный размер файлов в указанном каталоге и всех его подкаталогах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS