Получить список каталогов/файлов
Модератор: Модераторы
Получить список каталогов/файлов
Как при помощи Лазаруса в ОС Линукс (без использования визуальных компонентов) получить список:
1. каталогов;
2. файлов;
в заданной директории, для того что б записать в динамический массив?
1. каталогов;
2. файлов;
в заданной директории, для того что б записать в динамический массив?
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Padre_Mortius, чесно говоря не разобрался с предложенным примером. Можно поконкретнее как выглядит тот момент когда появляется имя файла или каталога? Как они различаются (каталоги файлы)?
qivi писал(а):Как они различаются (каталоги файлы)?
Они различаются аттрибутами. В TSearchRec есть поле Attr, по которому их и отличают. В предложенном Вам коде даже есть пример этого:
Код: Выделить всё
if ((fs.Attr and faDirectory) <> 0) //если каталог,Мы накладываем маску соответствующего аттрибута на это поле и если результат не равен нулю, то это оно и есть. Файл от каталога мы можем отличить по наличию аттрибута faDirectory у файла. Если аттрибут есть, значит этот файл - каталог, если нету, значит просто файл.
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
а для получения имени файла/директории стоит использовать аттрибут FileName класса TSearchRec
Касяк какой то!!! 
Обрабатывает верно, то есть выводит тока окошки с точками, а
просто игнорирует, выводит и с точками и без точек!!!
Код: Выделить всё
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
А если попробовать or на and поменять?
А если попробовать or на and поменять?
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
А если попробовать 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 раз.
Vadim писал(а):qivi
А если попробовать or на and поменять?
Ну... ОР - это у нас "или", АНД - и... не может же sf.Name быть равно обоим значениям одновременно...
- Alexx2000
- постоялец
- Сообщения: 490
- Зарегистрирован: 25.10.2006 00:22:07
- Откуда: Мытищи
- Контактная информация:
qivi писал(а):Ну... ОР - это у нас "или", АНД - и... не может же sf.Name быть равно обоим значениям...
Равно не может, но в условии же стоит
qivi писал(а):if (sf.Name<>'.') or (sf.Name<>'..') then showmessage (sf.Name);
- не равно, а не равно обоим может. А в данном случае оно должно быть не равно обоим.
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
- Откуда: Мытищи
- Контактная информация:
qivi писал(а):Равенство отрабатывает, неравинсво нет... мистика какая то...
Никакой мистики, в данном случае надо использовать and, т.к. c or условие выполняется если имя файла не равно хотя бы одному имени из условий, т.е. фактически условие всегда равно True.
Alexx2000 писал(а):qivi писал(а):Равенство отрабатывает, неравинсво нет... мистика какая то...
Никакой мистики, в данном случае надо использовать and, т.к. c or условие выполняется если имя файла не равно хотя бы одному имени из условий, т.е. фактически условие всегда равно True.
Так... кажется дошло...
Блин бывает же...
-
Tsukasa-mixer
- новенький
- Сообщения: 12
- Зарегистрирован: 06.04.2010 01:27:37
- Откуда: г.Киров
Код: Выделить всё
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 - обработано не будет =/ ....
заметил опытным путем.
