Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-77880
SeRg_2003
2003-07-11 07:05
2003.07.24
Ole error 800a03ec


8-78008
esk0rt
2003-02-17 23:26
2003.07.24
разложение звука


3-77743
Dorosh
2003-07-01 10:04
2003.07.24
Вызов функции из базы Access


6-78035
SkyRanger
2003-05-17 08:07
2003.07.24
Сокеты Win32


8-78010
pasha676
2003-04-02 10:58
2003.07.24
Торможу с рисованием в канвасе...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский