Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2009, 11:34   #1
---FISHER---
Пользователь
 
Аватар для ---FISHER---
 
Регистрация: 08.08.2009
Сообщений: 68
Печаль

Кто сможет информативно пояснить выделенные красным строчки кода?

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin 
ListBox1.Clear;
FindFile(Edit1.Text);
end;

procedure TForm1.FindFile(Dir:String); 
Var SR:TSearchRec; 
    FindRes:Integer; 
begin 
FindRes:=FindFirst(Dir+'*.*',faAnyFile,SR); 
While FindRes=0 do 
   begin 
      if ((SR.Attr and faDirectory)=faDirectory) and 
      ((SR.Name='.')or(SR.Name='..')) then 
         begin
если не затруднит по косточкам...

Код:
((SR.Attr and faDirectory)=faDirectory)
Просто по-моему это бессмыслица...
Код:
((найденый файл.Атрибут и "АтрибутДериктория") = АтрибутДериктория)
Самое дорогое, что у нас есть - это время...

Последний раз редактировалось Stilet; 14.08.2009 в 11:40.
---FISHER--- вне форума Ответить с цитированием
Старый 14.08.2009, 11:41   #2
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Код:
 if ((SR.Attr and faDirectory)=faDirectory) and 
((SR.Name='.')or(SR.Name='..')) then ...
Если ((атрибуты и флаг директории) = флагу директории) и
((Это текущий каталог) или (Это родительский)) тогда ...

В общем проверка, что это директория
psycho-coder вне форума Ответить с цитированием
Старый 14.08.2009, 11:43   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Просто по-моему это бессмыслица...
Нет не бессмыслица.
faDirectory хранит в себе число с выставленным битом, указывающим на то что это директория, отсюда
if (SR.Attr and faDirectory) даст число. Если это число равно числу в faDirectory то значит что это директория.

P.S. Учи логическую алгебру.
Это тоже самое что написать: (SR.Attr and faDirectory)<>0 просто у каждого свои вкусы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2009, 11:44   #4
---FISHER---
Пользователь
 
Аватар для ---FISHER---
 
Регистрация: 08.08.2009
Сообщений: 68
По умолчанию

По-моему абсолютно логичнее было бы написать так:

...если атрибут файла = дериктория, то...

Код:
 if (SR.Attr=faDirectory) then
так работаь не будет?
почему?
Самое дорогое, что у нас есть - это время...
---FISHER--- вне форума Ответить с цитированием
Старый 14.08.2009, 11:53   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
если атрибут файла = дериктория, то...
так работать не будет.
потому что могут быть установлены и другие биты, например, аттрибут что директория скрытая..
поэтому через логический AND выделяем нужный бит,
а потому уже результат, после выделения - сравниваем.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 14.08.2009, 11:56   #6
---FISHER---
Пользователь
 
Аватар для ---FISHER---
 
Регистрация: 08.08.2009
Сообщений: 68
По умолчанию

что вроде: в свойстве .Attr хранится не только признак дериктории?
и ещё я правильно понял
Код:
((SR.Attr and faDirectory)=faDirectory)
если это высказывание будет верно, то найденное не будет дерикторией?

дошло вроде...дурацкий препод у нас по той дисциплине где алгебру логики объясняли...

Код:
(SR.Name='.')or(SR.Name='..'))
а какие вообще значения может принимать свойство .Name ?

и вот:

Код:
Var SR:TSearchRec; 
    FindRes:Integer; 
begin 
FindRes:=FindFirst(Dir+'*.*',faAnyFile,SR); 
While FindRes=0 do 
   begin 
      if ((SR.Attr and faDirectory)=faDirectory) and 
      ((SR.Name='.')or(SR.Name='..')) then 
         begin 
            FindRes:=FindNext(SR); 
            Continue; 
         end; 
      if ((SR.Attr and faDirectory)=faDirectory) then
         begin 
            FindFile(Dir+SR.Name+'\');
            FindRes:=FindNext(SR);
            Continue;
         end; 
      ListBox1.Items.Add(SR.Name); 
      FindRes:=FindNext(SR); 
   end; 
FindClose(SR); 
end;
Continue - перевед к началу цикла? т.е. опять к условию While FindRes=0 do ? но если так то
Код:
ListBox1.Items.Add(SR.Name); 
FindRes:=FindNext(SR);
никогда не выполнится, ну пока оба условия не будут ложными
Самое дорогое, что у нас есть - это время...

Последний раз редактировалось Stilet; 14.08.2009 в 13:15.
---FISHER--- вне форума Ответить с цитированием
Старый 14.08.2009, 12:22   #7
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

Цитата:
Сообщение от ---FISHER--- Посмотреть сообщение
если это высказывание будет верно, то найденное не будет дерикторией?
Наоборот, будет директорией
Вот Вам по алгебре рас, а вот два

Цитата:
а какие вообще значения может принимать свойство .Name ?
Любые типа String. А вобще в нем хранятся найденные файлы (директории тоже файлы!)

ЗЫ Пользуйтесь "Правкой"
psycho-coder вне форума Ответить с цитированием
Старый 14.08.2009, 12:47   #8
s.Creator
Форумчанин
 
Регистрация: 28.09.2008
Сообщений: 344
По умолчанию

Цитата:
Сообщение от ---FISHER--- Посмотреть сообщение
[CODE]
Код:
Var SR:TSearchRec; 
    FindRes:Integer; 
begin 
FindRes:=FindFirst(Dir+'*.*',faAnyFile,SR); 
While FindRes=0 do 
   begin 
      if ((SR.Attr and faDirectory)=faDirectory) and 
      ((SR.Name='.')or(SR.Name='..')) then 
         begin 
            FindRes:=FindNext(SR); 
            Continue; 
         end; 
      if ((SR.Attr and faDirectory)=faDirectory) then
         begin 
            FindFile(Dir+SR.Name+'\');
            FindRes:=FindNext(SR);
            Continue;
         end; 
      ListBox1.Items.Add(SR.Name); 
      FindRes:=FindNext(SR); 
   end; 
FindClose(SR); 
end;
Я так попонимаю Вы привели код тела функции function FindFile(Dir);
которая рекурсивно (просматривая вложенные папки) находит все файлы и заносит их список в ListBox1.

Код:
      if ((SR.Attr and faDirectory)=faDirectory) and 
      ((SR.Name='.')or(SR.Name='..')) then 
         begin 
            FindRes:=FindNext(SR); 
            Continue; 
         end;
пропускаем текущую и родительскую директорию и ищем дальше.
Код:
      if ((SR.Attr and faDirectory)=faDirectory) then
         begin 
            FindFile(Dir+SR.Name+'\');
            FindRes:=FindNext(SR);
            Continue;
         end;
Нашли вложенную папку рекурсивно просматриваем ее содержимое (FindFile(Dir+SR.Name+'\');)
Если ни то ни другое - то это файл - записываем его в список
Код:
      ListBox1.Items.Add(SR.Name); 
      FindRes:=FindNext(SR);
и продолжаем поиск.
s.Creator вне форума Ответить с цитированием
Старый 15.08.2009, 11:32   #9
---FISHER---
Пользователь
 
Аватар для ---FISHER---
 
Регистрация: 08.08.2009
Сообщений: 68
По умолчанию

Может я либо глупоко тупой, либо этот алгоритм поиска файлов не самый простой. Есть ли какой нибудь аналогичный алгоритм, только более простой для понимания. Или может кто нибудь сможет более детально этот алгоритм на словах описать. Я понимаю всё строчки этого кода, но не понимаю как он пошагово работает...
Самое дорогое, что у нас есть - это время...
---FISHER--- вне форума Ответить с цитированием
Старый 15.08.2009, 15:35   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

это самый простой алгоритм поиска файлов.
Единственно, что может вызвать сложность для понимания - это используемая в алгоритме рекурсия..
Просто походите в отладчике пошагово - всё поймёте..

Смотрите. (далее по тексту Директория и Папка - синонимы!)
Код:
  Ищем любой файл/папку в папке заданной переменной в Dir
      FindRes:=FindFirst(Dir+'*.*',faAnyFile,SR); 
  если хоть один объект файловой системы нашёлся, то
     проверим - если это директория и её имя точка или двоеточие - то ничего не делаем
      (переходим на поиск следующего элемента файловой системы)
     Если это директория, тогда вызываем этот же алгорим поиска файлов в обнаруженной папке 
       (ЭТО И ЕСТЬ РЕКУРСИЯ - вызов процедуры из самой процедуры) - считайте, что просто вызвали свою процедуру, 
        только не в исходной директории Dir - а в найденной директории
        (имя этой директории будет  Dir + Sr.Name + '\' )...
    Если же это не папка - то это файл. Его имя просто помещаем в список. 
       Полный путь к найденному файлу  = Dir + Sr.Name

цикл повторяем, пока находятся объекты. Как только все объекты закончатся - мы выходим из процедуры.
p.s. кстати, я лично так пишу подобный алгоритм:
Код:
procedure FindFile(Dir: string);
var SR: TSearchRec;
  FindRes: Integer;
begin
  FindRes := FindFirst(Dir + '*.*', faAnyFile, SR);
  while FindRes = 0 do
  begin
    if ((SR.Attr and faDirectory) = faDirectory) then
    begin
      if (SR.Name <> '.') and (SR.Name <> '..') then
        FindFile(Dir + SR.Name + '\');
    end
    else
      ListBox1.Items.Add(SR.Name);
    FindRes := FindNext(SR);
  end;
  FindClose(SR);
end;
p.p.s. Зачем в ListBox кидать кучу имён файлов без полного пути?.. что Вы потом с этой массой делать собираетесь? просто наслаждаться именами?

Последний раз редактировалось Serge_Bliznykov; 15.08.2009 в 15:37.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С++. Поиск файлов profi Помощь студентам 2 16.06.2009 16:04
Поиск файлов hacknet Общие вопросы Delphi 23 24.11.2008 17:54
Поиск файлов LeoN Общие вопросы Delphi 5 25.11.2007 22:54
поиск файлов KORN Компоненты Delphi 3 12.10.2007 05:42