Главная страница
    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.046 c
1-1117780271
Denis
2005-06-03 10:31
2005.06.29
Как заставить 2 грида прокручивать столбцы синхронно?


3-1116151960
_e_u_
2005-05-15 14:12
2005.06.29
добавление полей в ADOQuery, что требуется?


14-1117603804
BiN
2005-06-01 09:30
2005.06.29
С Днем Защиты Детей, что ли


14-1117520678
palva
2005-05-31 10:24
2005.06.29
Закрыть для себя 25 порт


14-1117675849
Dyakon_Frost
2005-06-02 05:30
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский