Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> FindFirst & FindNext, аттрибуты находимых файлов 
:(
    Опции темы
AgereS
Дата 2.3.2005, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 23.6.2004

Репутация: нет
Всего: 3



прошу помощи у спецов (отцов smile ) в программинге:
наваял тут программку - на форме ListBox (туда выводятся файлы из дирректории C:\) по нажатию кнопки.
проблемма вот в чём:
при установке аттрибута в FindFirst выводить все файлы, программа выводит даже те файлы какие не отображает проводник (разве такое бывает чтобы проводник не отображал все файлы?), а при установке аттрибута выводить директории - прога выводит и директории и файлы, то есть то что отображает проводник.
или я не умею пользоваться дельфи (что очевидно) либо не знаю чего...
PM MAIL ICQ   Вверх
Snowy
Дата 2.3.2005, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Проводник по умолчанию не показывает скрытые и системныефайлы.
А FindFirst показывает все, если задать ему все атрибуты.
Кроме того, если мы просим найти только директории, то он ищет все.
Это еще с паскаля тянется. Видимо для рекурсивного поиска сделано.
Если нужны только директории, то нужно каждую найденую запись дополнительно проверять на атрибут директория.
PM MAIL   Вверх
~FoX~
Дата 2.3.2005, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Код

//==================Поиск файлов==============
procedure GetFile(Dir: string; ras: string); //Dir - путь к директории, ras - расширение файла.
var
f : TSearchRec;
i : integer;
s, key : string;
begin
i := FindFirst(Dir+ras, faAnyFile, f);
 while (i=0) do
  begin
   s := Dir+f.Name; // Сюда складываются пути и названия найденных файлов
   i := FindNext(f);
   Application.ProcessMessages;
  end;
FindClose(f);
end;

//==================Поиск дирикторий==============
procedure GetDir(Dir: string); //Путь к директории
var
f : TSearchRec;
i : integer;
begin
i := FindFirst(Dir+'*.*', faDirectory, f);

while (i=0) do
  begin
  if (f.Name='.') or (f.Name='..') then
  else
    begin
    if (f.Attr and faDirectory)<>0 then
      begin
        GetDir(Dir+f.Name+'\');
        Application.ProcessMessages;
      end
    else
      begin
       i := FindNext(f);
      end;
    end;
    i := FindNext(f);
    Application.ProcessMessages;
  end;
FindClose(f);
end;



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
AgereS
Дата 2.3.2005, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 426
Регистрация: 23.6.2004

Репутация: нет
Всего: 3



круто ! я смотрю ты там и рекурсию влепил - я бы не додумался...
PM MAIL ICQ   Вверх
Snowy
Дата 2.3.2005, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Естественно. А как же обходить директории без рекурсии?
Рекурсия, пожалуй, единственный способ, не считая извращений.
PM MAIL   Вверх
~FoX~
Дата 2.3.2005, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



Цитата(AgereS @ 2.3.2005, 11:59)
круто ! я смотрю ты там и рекурсию влепил - я бы не додумался...

Дык мы не первый год за мужем то smile
smile smile smile


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Bes
Дата 3.3.2005, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: 5
Всего: 7



На. Работает. Сам этим пользуюсь.

Главная хитрость в том, что нельзя давать в качестве параметра faDirectory т.к. в этом случае покажутся папки которые имеют ТОЬЛКО такой параметр

Код

Рrocedure GetListDir(List: TStrings; Const path:string; Const dir:string);
Var
    FS:TSearchRec;
begin
    List.Clear;
    FindFirst(path,faAnyFile,FS);//НУЖНО ВЫЗВАТЬ ТАК
    Repeat
         if dir='dir' then
         begin
              if (FS.Attr and faDirectory)=faDirectory then//А ПОТОМ ПРОВЕРИТЬ ТАК.
              begin
                   List.Add(FS.Name+#9+Inttostr(FS.Size)+#9+DateTimeToStr(FS.Time)+#9+inttostr(FS.Attr));
              end;
         end else
         begin
              if (FS.Attr and faDirectory)<>faDirectory then
              begin
                   List.Add(FS.Name+#9+Inttostr(FS.Size)+#9+DateTimeToStr(FS.Time)+#9+inttostr(FS.Attr));
              end;
         end;
    Until FindNext(FS)<>0;

    FindClose(FS);
end;


кстати, параметр dir определяет будет выводить ф-я директории или файлы.

Это сообщение отредактировал(а) Bes - 3.3.2005, 07:29
PM MAIL   Вверх
Tsume
Дата 3.3.2005, 15:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Директория задается несколькими флагами...
пример:

Код

var sr : TSearchRec;
...
FilesList.Clear;
 if FindFirst(Folder+'\*.*',faAnyFile,sr)=0 then
   begin
     if (sr.Attr in [16..19,48..51]) and (not AnsiMatchText(sr.Name,['.','..']))
         then FilesList.Add(sr.Name);
     while FindNext(sr)=0 do
       if (sr.Attr in [16..19,48..51]) and (not AnsiMatchText(sr.Name,['.','..']))
         then FilesList.Add(sr.Name);
     FilesList.Sort; //Обязательно! Иначе будет весело...
   end;


  Вверх
Tsume
Дата 3.3.2005, 15:03 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











P.S. Folder - это входной параметр в процедуру...
FileList.Sort - необязательно (из-за того, что у мя стоял Find вместо indexof) - забыл удалить...
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0834 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.