Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.24;
Скачать: CL | DM;

Вниз

Помогите найти ошибку в функции!   Найти похожие ветки 

 
DVM ©   (2003-05-22 14:00) [0]

Подсчет размера каталога. Почему то для некоторых каталогов возвращается неправильный (меньший) размер. Что-то я никак не могу понять, в чем дело. Да, кстати, SysUtils не предлагать.
Нужно именно так, через Win32Api.
Заранее спасибо.

function GetDirectorySize(const Path: string): Int64;
var
FD : TWin32FindData;
FH : THandle;
TempSize: TULargeInteger;
begin
Result := 0;
FH := FindFirstFile( PChar( Path + "*.*" ), FD );
repeat
if (FH<>INVALID_HANDLE_VALUE) and (FD.cFileName <> string(".")) and (FD.cFileName<>string("..")) then
begin
if (FILE_ATTRIBUTE_DIRECTORY and GetFileAttributes(PChar(Path + FD.cFileName))) <> 0 then
Inc(Result, GetDirectorySize(Path + FD.cFileName + "\"))
else
begin
TempSize.LowPart := FD.nFileSizeLow;
TempSize.HighPart := FD.nFileSizeHigh;
Inc(Result, TempSize.QuadPart);
end;
end;
until FindNextFile(FH,FD) = false;
FindClose(FH);
end;


 
Игорь Шевченко ©   (2003-05-22 14:24) [1]

Отладчик в руки и пошаговая отладка.


 
DVM ©   (2003-05-22 14:41) [2]

Дело в том, что ошибка начинает появляться, когда каталог насчитывает тысячи файлов, и сотни вложенных каталогов.
Например, c:\ подсчитывает неправильно.
Но в тоже время c:\windows\ подсчитывает без проблем, а там файлов и каталогов тоже немало.
Спасибо, что напомнили про отладчик, но по шагам пройти тысячи повторений цикла мне что-то не хочется. Может есть какая-то явная ошибка, которую я не замечаю просто? Может дело в рекурсии на большую глубину? Ошибку я все равно найду. Просто просил взглянуть.


 
clickmaker ©   (2003-05-22 14:46) [3]

GetFileAttributes(PChar(Path + FD.cFileName)) - лишнее, можно FD.dwFileAttributes.
Попробуй найти закономерность: чем эти "плохие" каталоги отличаются от остальных


 
DVM ©   (2003-05-22 15:20) [4]


> clickmaker

Спасибо за предложение.

Прошу у всех прощения, я стормозил. При просмотре результата использовал IntTostr(GetDirectorySize(...)), которая и искажала результат. Ошибка не в функции. Integer - слишком мал.

Всем спасибо.


 
AlexRush ©   (2003-05-22 16:45) [5]

Тем не менее....

function _GetDirectorySize(Path: string): Int64;
var fd:WIN32_FIND_DATAA;
hFile:DWORD;
bFlag:boolean;
size:TULargeInteger;
begin
result:=0;
size.QuadPart:=0;

if Path[length(path)]<>"\"
then Path:=Path+"\";

hFile:=FindFirstFileA(PChar(Path+"*"),fd);
bFlag:=hFile<>INVALID_HANDLE_VALUE;

while (bFlag)
do begin
if (lstrcmp(fd.cFileName,".")<>0)
and
(lstrcmp(fd.cFileName,"..")<>0)
then begin
if (fd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY)=FILE_ATTRIBUTE_DIRECTORY
then size.QuadPart:=size.QuadPart+_GetDirectorySize(Path+fd.cFileName)
else begin
size.HighPart:=fd.nFileSizeHigh;
size.LowPart:=fd.nFileSizeLow;
end;
end;
bFlag:=FindNextFileA(hFile,fd);
end;
Windows.FindClose(hFile);
result:=size.QuadPart;
end;


 
AlexRush ©   (2003-05-22 16:47) [6]

Хотя и здесь есть ошибка.... :)))


 
icWasya ©   (2003-05-22 17:29) [7]

это чего ??
if ... then
size.QuadPart:=size.QuadPart+_GetDirectorySize(Path+fd.cFileName)
else begin
size.HighPart:=fd.nFileSizeHigh;
size.LowPart:=fd.nFileSizeLow;
end;


в одном случае прибавляешь - вдругом присваиваешь


 
AlexRush ©   (2003-05-22 17:48) [8]

icWasya © (22.05.03 17:29)>> Я ж и говорю :))))) Затупил :) Кой-че исправлял прямо в бровзере. И исправил :)))



Страницы: 1 вся ветка

Текущий архив: 2003.07.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.016 c
3-77797
Sliften
2003-06-29 20:38
2003.07.24
Как програмно добавить поле


6-78031
Chris
2003-05-16 20:02
2003.07.24
Как узнать маршрут между хостами в локальной сети?


1-77935
Oleg__
2003-07-10 15:34
2003.07.24
Компонент


1-77988
Вован
2003-07-10 18:13
2003.07.24
Объясните пожалуйста что, возвращает GetDC(0)


1-77838
Navi
2003-07-06 13:49
2003.07.24
TUpDown in TStringGrid