Форум: "WinAPI";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
ВнизПомогите найти ошибку в функции! Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c