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

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

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

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

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

Сообщение qivi »

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

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

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

Сообщение qivi »

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

Сообщение Vadim »

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

Они различаются аттрибутами. В TSearchRec есть поле Attr, по которому их и отличают. В предложенном Вам коде даже есть пример этого:

Код: Выделить всё

if ((fs.Attr and faDirectory) <> 0)                              //если каталог,

Мы накладываем маску соответствующего аттрибута на это поле и если результат не равен нулю, то это оно и есть. Файл от каталога мы можем отличить по наличию аттрибута faDirectory у файла. Если аттрибут есть, значит этот файл - каталог, если нету, значит просто файл.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

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

Сообщение qivi »

Касяк какой то!!! :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);


просто игнорирует, выводит и с точками и без точек!!!
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

qivi
А если попробовать or на and поменять?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

А если попробовать 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 раз.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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


Ну... ОР - это у нас "или", АНД - и... не может же sf.Name быть равно обоим значениям одновременно...
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

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

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

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

Сообщение qivi »

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 раз.
Аватара пользователя
Alexx2000
постоялец
Сообщения: 490
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи
Контактная информация:

Сообщение Alexx2000 »

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

Никакой мистики, в данном случае надо использовать and, т.к. c or условие выполняется если имя файла не равно хотя бы одному имени из условий, т.е. фактически условие всегда равно True.
Аватара пользователя
qivi
энтузиаст
Сообщения: 703
Зарегистрирован: 19.01.2009 12:45:54
Откуда: Россия

Сообщение qivi »

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

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


Так... кажется дошло... :) :roll:
Блин бывает же...
Tsukasa-mixer
новенький
Сообщения: 12
Зарегистрирован: 06.04.2010 01:27:37
Откуда: г.Киров

Сообщение Tsukasa-mixer »

Код: Выделить всё

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 - обработано не будет =/ ....
заметил опытным путем.
Ответить