Получить список каталогов/файлов

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Получить список каталогов/файлов

Сообщение qivi » 03.04.2010 15:01:20

Как при помощи Лазаруса в ОС Линукс (без использования визуальных компонентов) получить список:

1. каталогов;
2. файлов;

в заданной директории, для того что б записать в динамический массив?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Получить список каталогов/файлов

Сообщение Padre_Mortius » 03.04.2010 15:20:10

Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Получить список каталогов/файлов

Сообщение qivi » 03.04.2010 16:35:35

Padre_Mortius, чесно говоря не разобрался с предложенным примером. Можно поконкретнее как выглядит тот момент когда появляется имя файла или каталога? Как они различаются (каталоги файлы)?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Получить список каталогов/файлов

Сообщение Vadim » 03.04.2010 17:01:18

qivi писал(а):Как они различаются (каталоги файлы)?

Они различаются аттрибутами. В TSearchRec есть поле Attr, по которому их и отличают. В предложенном Вам коде даже есть пример этого:
Код: Выделить всё
if ((fs.Attr and faDirectory) <> 0)                              //если каталог,

Мы накладываем маску соответствующего аттрибута на это поле и если результат не равен нулю, то это оно и есть. Файл от каталога мы можем отличить по наличию аттрибута faDirectory у файла. Если аттрибут есть, значит этот файл - каталог, если нету, значит просто файл.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Получить список каталогов/файлов

Сообщение Padre_Mortius » 03.04.2010 17:17:16

а для получения имени файла/директории стоит использовать аттрибут FileName класса TSearchRec
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Получить список каталогов/файлов

Сообщение qivi » 05.04.2010 16:25:48

Касяк какой то!!! :shock:

Код: Выделить всё
var sf:TSearchRec;
...
if (sf.Name='.') or (sf.Name='..') then showmessage (sf.Name);


Обрабатывает верно, то есть выводит тока окошки с точками, а

Код: Выделить всё
var sf:TSearchRec;
...
if (sf.Name<>'.') or (sf.Name<>'..') then showmessage (sf.Name);


просто игнорирует, выводит и с точками и без точек!!!
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Получить список каталогов/файлов

Сообщение Vadim » 05.04.2010 17:23:37

qivi
А если попробовать or на and поменять?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Получить список каталогов/файлов

Сообщение Padre_Mortius » 05.04.2010 18:33:23

А если попробовать or на and поменять?

Зачем? Там скорее всего не правильное условие в начале стоит
Код: Выделить всё
var
  FileList: TStringList;
  i: integer;
  Sr: TSearchRec;
  Path: AnsiString;
begin
  FileList := TStringList.Create;
  i := FindFirst(Path + '*.' + OutExt, faAnyFile, Sr);
  while i = 0 do
  begin
    if (Sr.Name <> '.') or (Sr.Name <> '..') then FileList.Add(Sr.Name);
    i := FindNext(Sr);
    Application.ProcessMessages;
  end;
  SysUtils.FindClose(Sr);
end;
Последний раз редактировалось Padre_Mortius 05.04.2010 18:36:19, всего редактировалось 1 раз.
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Получить список каталогов/файлов

Сообщение qivi » 05.04.2010 18:35:07

Vadim писал(а):qivi
А если попробовать or на and поменять?


Ну... ОР - это у нас "или", АНД - и... не может же sf.Name быть равно обоим значениям одновременно...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Получить список каталогов/файлов

Сообщение Alexx2000 » 05.04.2010 18:39:30

qivi писал(а):Ну... ОР - это у нас "или", АНД - и... не может же sf.Name быть равно обоим значениям...

Равно не может, но в условии же стоит
qivi писал(а):if (sf.Name<>'.') or (sf.Name<>'..') then showmessage (sf.Name);

- не равно, а не равно обоим может. А в данном случае оно должно быть не равно обоим.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Получить список каталогов/файлов

Сообщение qivi » 05.04.2010 18:44:08

Alexx2000 писал(а):
qivi писал(а):- не равно, а не равно обоим может.


Правильно, а я того и добиваюсь мне нужно отбросить из общего списка текущий каалог и "вверх"...

Равенство отрабатывает, неравинсво нет... мистика какая то...

Вот это было взято за пример:

Код: Выделить всё
var
  searchResult : TSearchRec;

begin
  // Пробуем найти каталоги выше текущего каталога
  SetCurrentDir('..');

  if FindFirst('*', faDirectory, searchResult) = 0 then
  begin
    repeat
      // Показываем только каталоги
      if (searchResult.attr and faDirectory) = faDirectory  then ShowMessage('Directory = '+searchResult.Name);
    until FindNext(searchResult) <> 0;

    // Должен освободить ресурсы, используемые этими успешными, поисками
    FindClose(searchResult);
  end;
end;


Заместо "ShowMessage('Directory = '+searchResult.Name)" там открыто тело условия и пошла моя отсебятина, но она должна выполнятся тока в случае если это не точки...
Последний раз редактировалось qivi 05.04.2010 18:51:12, всего редактировалось 1 раз.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Получить список каталогов/файлов

Сообщение Alexx2000 » 05.04.2010 18:48:12

qivi писал(а):Равенство отрабатывает, неравинсво нет... мистика какая то...

Никакой мистики, в данном случае надо использовать and, т.к. c or условие выполняется если имя файла не равно хотя бы одному имени из условий, т.е. фактически условие всегда равно True.
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Получить список каталогов/файлов

Сообщение qivi » 05.04.2010 18:52:41

Alexx2000 писал(а):
qivi писал(а):Равенство отрабатывает, неравинсво нет... мистика какая то...

Никакой мистики, в данном случае надо использовать and, т.к. c or условие выполняется если имя файла не равно хотя бы одному имени из условий, т.е. фактически условие всегда равно True.


Так... кажется дошло... :) :roll:
Блин бывает же...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Получить список каталогов/файлов

Сообщение Tsukasa-mixer » 06.04.2010 21:03:32

Код: Выделить всё
procedure TSearch_Thread.scanFileTree(strNode: string);
var SR: TSearchRec;
    str:string;
begin
    str:= SysToUTF8(strNode);
    if FindFirst(str+'\*', faAnyFile, SR) = 0 then
     repeat
          str:= SysToUTF8(SR.Name);
          if not ((str = '.')or(str = '..')or(str = '...'))then
          begin
               if (sr.Attr = faDirectory) then
               begin
                    {Тут обрабатывается для папок}
               end else
               begin
                    {Тут обрабатывается для файлов}
               end;
          end;
     until FindNext(SR) <> 0;
    FindClose(SR);
end;       


Тока смею заметить, что пустые папки лазарем не перевариваются, в смысле он их находит, но условие if (sr.Attr = faDirectory) then - обработано не будет =/ ....
заметил опытным путем.
Tsukasa-mixer
новенький
 
Сообщения: 12
Зарегистрирован: 06.04.2010 01:27:37
Откуда: г.Киров


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 52

Рейтинг@Mail.ru