![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите найти ошибку в функции! [D6, WinXP]
DVM © (2003-05-22 14:00:00)Подсчет размера каталога. Почему то для некоторых каталогов возвращается неправильный (меньший) размер. Что-то я никак не могу понять, в чем дело. Да, кстати, 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;
AlexRush (2003-05-22 17:48:00) [1]icWasya © (22.05.03 17:29)>> Я ж и говорю :))))) Затупил :) Кой-че исправлял прямо в бровзере. И исправил :)))
icWasya (2003-05-22 17:29:00) [2]это чего ??
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 16:47:00) [3]Хотя и здесь есть ошибка.... :)))
AlexRush (2003-05-22 16:45:00) [4]Тем не менее....
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;
DVM (2003-05-22 15:20:00) [5]
> clickmaker
Спасибо за предложение.
Прошу у всех прощения, я стормозил. При просмотре результата использовал IntTostr(GetDirectorySize(...)), которая и искажала результат. Ошибка не в функции. Integer - слишком мал.
Всем спасибо.
clickmaker (2003-05-22 14:46:00) [6]GetFileAttributes(PChar(Path + FD.cFileName)) - лишнее, можно FD.dwFileAttributes.
Попробуй найти закономерность: чем эти "плохие" каталоги отличаются от остальных
DVM (2003-05-22 14:41:00) [7]Дело в том, что ошибка начинает появляться, когда каталог насчитывает тысячи файлов, и сотни вложенных каталогов.
Например, c:\ подсчитывает неправильно.
Но в тоже время c:\windows\ подсчитывает без проблем, а там файлов и каталогов тоже немало.
Спасибо, что напомнили про отладчик, но по шагам пройти тысячи повторений цикла мне что-то не хочется. Может есть какая-то явная ошибка, которую я не замечаю просто? Может дело в рекурсии на большую глубину? Ошибку я все равно найду. Просто просил взглянуть.
Игорь Шевченко (2003-05-22 14:24:00) [8]Отладчик в руки и пошаговая отладка.