Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.041 c
1-1117628075
webpauk
2005-06-01 16:14
2005.06.29
Расширение возможностей TmenuItem


1-1118318165
Cat
2005-06-09 15:56
2005.06.29
TComboBox ItemIdex


3-1116060682
_e_u_
2005-05-14 12:51
2005.06.29
проблема с добавлением использованием записи


9-1110418223
parovoZZ
2005-03-10 04:30
2005.06.29
DirectDraw и ... Господа))


14-1117127529
palva
2005-05-26 21:12
2005.06.29
Про гнилой строй





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский