Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите найти ошибку в функции подсчета кол-ва файлов... [D6, Win2k]


Cosinus ©   (2005-06-06 12:34:00) 

Есть функция рекурсивного сканирования дерева каталогов с добавлением их в нек. ListBox (для примера)...

function ScanDir(Dir: string):integer;
var
 SearchRec: TSearchRec;
begin
 if Dir <> '' then
   if Dir[length(Dir)] <> '\' then
     Dir := Dir + '\';
 if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
   repeat
     if (SearchRec.name = '.') or (SearchRec.name = '..') then
       continue;
     if (SearchRec.Attr and faDirectory) <> 0 then
       ScanDir(Dir + SearchRec.name)
     else
       Result:=Form1.UrlList.Items.Add(Dir+SearchRec.name);
   until FindNext(SearchRec) <> 0;
 FindClose(SearchRec);
end;

Простой переделкой хочу сделать из нее функцию банального подсчета файлов...

function GetFileCount(Count:integer;Dir: string): integer;
var
 SearchRec: TSearchRec;
begin
 if Dir <> '' then
   if Dir[length(Dir)] <> '\' then
     Dir := Dir + '\';
 if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
   repeat
     if (SearchRec.name = '.') or (SearchRec.name = '..') then
       continue;
     if (SearchRec.Attr and faDirectory) <> 0 then
       GetFileCount(Count,Dir + SearchRec.name)
     else
     inc(Count);
   until FindNext(SearchRec) <> 0;
 FindClose(SearchRec);
 Result:=Count;
end;


Почему то результаты первой функции не совпадают с результатами второй - во второй меньше. Не пойму почему...
Отличия то минимальны. Что я упустил?


novice_man   (2005-06-06 13:04:00) [1]

jack128 ©   (06.06.05 13:01) [9]

Вы не правы. :) Проверял несколько раз.


Cosinus   (2005-06-06 13:03:00) [2]


> novice_man ©   (06.06.05 12:59) [6]
Да, спасибо, я уже допер.
И то, что d первом примере на 1 меньше считает, тоже понятно :) Я там еденичку прибавлял :)


Cosinus   (2005-06-06 13:01:00) [3]


> Digitman ©   (06.06.05 12:54) [3]
Сначала не понял, но после Alexander Panov ©   (06.06.05 12:56) [4]понял :)
Спасибо, стормозил.


jack128   (2005-06-06 13:01:00) [4]

novice_man ©   (06.06.05 12:59) [6]
В первом варианте тоже неправильно считает количество файлов. :)

в твоем тоже не правельно считает ;)

Count вообще здесь не нужен..
function GetFileCount(Dir: string): integer;
var
SearchRec: TSearchRec;
begin
Result := 0;
if Dir <> '' then
  if Dir[length(Dir)] <> '\' then
    Dir := Dir + '\';
if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
try
  repeat
    if (SearchRec.name = '.') or (SearchRec.name = '..') then
      continue;
    if (SearchRec.Attr and faDirectory) <> 0 then
      inc(Result, GetFileCount(Dir + SearchRec.name))
    else
      inc(Result);
  until FindNext(SearchRec) <> 0;
finally
  FindClose(SearchRec);
end;
end;


novice_man   (2005-06-06 13:00:00) [5]

if Dir[length(Dir)] <> '\' then Dir := Dir + '\';
равнозначно IncludeTrailingPathDelimiter(const S: string): string;


novice_man   (2005-06-06 12:59:00) [6]

function GetFileCount(Count:integer;Dir: string): integer;
var
SearchRec: TSearchRec;
begin
if Dir <> '' then
  if Dir[length(Dir)] <> '\' then
    Dir := Dir + '\';
if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
  repeat
    if (SearchRec.name = '.') or (SearchRec.name = '..') then
      continue;
    if (SearchRec.Attr and faDirectory) <> 0 then
      Count :=GetFileCount(Count,Dir + SearchRec.name)
    else
    inc(Count);
  until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
Result:=Count;
end;


Исправь как показано. В первом варианте тоже неправильно считает количество файлов. :)


Digitman   (2005-06-06 12:58:00) [7]


> Alexander Panov ©   (06.06.05 12:56) [4]


а нашута ему ссылка ?

результат он получает в виде int-значения, возвращаемого ф-цией ..

а что уж он там с Count делает дальше - это его проблема ..


Alexander Panov   (2005-06-06 12:56:00) [8]

function GetFileCount( varCount:integer;Dir: string): integer;


Digitman   (2005-06-06 12:54:00) [9]

и каков смысл в этом ?

почему бы не передать -123456 ?
или 987654321 ?


Cosinus   (2005-06-06 12:49:00) [10]


> Digitman ©   (06.06.05 12:42) [1]

В самом начале 0


Digitman   (2005-06-06 12:42:00) [11]


> GetFileCount(Count


что передается параметром Count ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо