Главная страница
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.019 c
7-78178
LedWorm
2003-05-14 19:16
2003.07.24
Отображение содержимого окна при перетаскивании.


3-77773
mihmax
2003-06-19 16:00
2003.07.24
BDE не видит MS SQL


3-77778
Солер
2003-07-02 12:38
2003.07.24
Как скопировать строку DBGrid?


1-77834
_NoS_
2003-07-09 19:27
2003.07.24
Список форм


7-78164
Deus
2003-04-29 03:14
2003.07.24
Right Button = Left Button