Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Помогите найти ошибку в функции подсчета кол-ва файлов...   Найти похожие ветки 

 
Cosinus ©   (2005-06-06 12:34) [0]

Есть функция рекурсивного сканирования дерева каталогов с добавлением их в нек. 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;


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


 
Digitman ©   (2005-06-06 12:42) [1]


> GetFileCount(Count


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


 
Cosinus ©   (2005-06-06 12:49) [2]


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

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


 
Digitman ©   (2005-06-06 12:54) [3]

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

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


 
Alexander Panov ©   (2005-06-06 12:56) [4]

function GetFileCount(var Count:integer;Dir: string): integer;


 
Digitman ©   (2005-06-06 12:58) [5]


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


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

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

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


 
novice_man ©   (2005-06-06 12:59) [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;


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


 
novice_man ©   (2005-06-06 13:00) [7]

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


 
Cosinus ©   (2005-06-06 13:01) [8]


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


 
jack128 ©   (2005-06-06 13:01) [9]

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;


 
Cosinus ©   (2005-06-06 13:03) [10]


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


 
novice_man ©   (2005-06-06 13:04) [11]

jack128 ©   (06.06.05 13:01) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
1-1118140307
Sigetta
2005-06-07 14:31
2005.06.29
Размер exe-шника


14-1117479218
NailMan
2005-05-30 22:53
2005.06.29
Надо есть правильные сладости! :-)))


1-1118086794
Pasha L
2005-06-06 23:39
2005.06.29
openDialog


3-1116297685
weris
2005-05-17 06:41
2005.06.29
Запрос SQl - пробема ...


9-1110528883
Guest2005
2005-03-11 11:14
2005.06.29
Вывод изображения используя средства D3D