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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2008, 09:41   #1
FAiver
Пользователь
 
Аватар для FAiver
 
Регистрация: 13.07.2007
Сообщений: 60
Вопрос

Мне необходимо из определённой директории вывести в мемо все файлы и папки. я делаю это так:
Код:
procedure ListFileDir(Path: string; FileList: TStrings);
 var
   SR: TSearchRec;
 begin
   if FindFirst(Path +'*.*', faAnyFile, SR) = 0 then
   begin
     repeat
      FileList.Add(SR.Name);
     until FindNext(SR) <> 0;
     FindClose(SR);
   end;
 end;
но почемуто выводятся не все папки! что я не так делаю?

а если вписать FindFirst(Path +'*.*', faDirectory , SR) то отображаются не все файлы

Последний раз редактировалось Stilet; 18.04.2008 в 08:01.
FAiver вне форума Ответить с цитированием
Старый 27.03.2008, 09:52   #2
merax
Форумчанин
 
Регистрация: 27.12.2006
Сообщений: 955
По умолчанию

Дак тыж пытаешься Директории(Папки) отразить, а не файлы !

Он захватывает все директории + добавляет еще некоторые файлы. Вопрос к Delphi гуру. Почему?

Последний раз редактировалось merax; 27.03.2008 в 10:07.
merax вне форума Ответить с цитированием
Старый 17.04.2008, 17:39   #3
GAGARIN-NEW
Познаю мир
Форумчанин Подтвердите свой е-майл
 
Аватар для GAGARIN-NEW
 
Регистрация: 05.10.2007
Сообщений: 387
По умолчанию

Тоже интересует данный вопрос. Почему? получиш работающий код выложив этой теме плиз.
---
GAGARIN-NEW вне форума Ответить с цитированием
Старый 17.04.2008, 17:59   #4
vitalik007
Дельфист
Форумчанин
 
Аватар для vitalik007
 
Регистрация: 14.08.2007
Сообщений: 317
По умолчанию

Код:
var
Cdir:string;     //имя папки,в которой надо искать

procedure find;
var search:Tsearchrec;
begin
getDir(0,Cdir);
if Cdir[length(Cdir)]<>'\' then Cdir:=Cdir+'\';
if findfirst(filename,faAnyFile,search)=0 then
repeat
if (search.Attr and faAnyFile)=search.Attr then  begin
form1.Memo1.Lines.Add(Cdir+search.Name);
inc(n);
end;
until findnext(search)<>0;
if findfirst('*',faAnyFile,search)=0 then
repeat
if (search.Attr and faDirectory)=faDirectory then
if search.Name[1]<>'.' then begin
chdir(search.Name);
find;
chdir('..');
end;
until findnext(search)<>0;
end;
ICQ-465033557
WINDOWS CE THE BEST
vitalik007 вне форума Ответить с цитированием
Старый 17.04.2008, 21:23   #5
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от FAiver Посмотреть сообщение
а если вписать FindFirst(Path +'*.*', faDirectory , SR) то отображаются не все файлы
Как много нам открытий чудных...

Вот уж никогда бы не подумал, что FindFirst принесет сюрпризы. Всегда вызывал одинаково - faAnyFile, потом в цикле проверка. Вот, примерно, как у vitalik007 и даже не задумывался. После вопроса полез в код VCL.

Оказывается, FindFirst вызывает FindFirstFile из WinAPI. А, поскольку, у той не предусмотрена фильтрация, файлы отсеиваются после вызова, но не прямым сравнением с указанными атрибутами, а, наоборот:

сначала готовятся исключаемые атрибуты:

faSpecial = faHidden or faSysFile or faVolumeID or faDirectory;
F.ExcludeAttr := not Attr and faSpecial;

если атрибуты очередного файла попадают в ExcludeAttr, файл пропускается вызовом findNextFile.

Выводы.

Задавая маску атрибутов мы не экономим время, так как вызовы WinAPI делаются для каждого файла каталога всегда.

Использовав как маску один из атрибутов faHidden, faSysFile, faVolumeID, faDirectory мы не получим результата, который могли бы ожидать.
Так что лучшим вариантом остается вызов с faAnyFile и отбором файлов в цикле.
alexBlack вне форума Ответить с цитированием
Старый 17.04.2008, 22:27   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вывести содержимое каталога со всеми подкаталогами... Без рекурсии не обойтись...
Только что давал кому-то вывод в дерево. Вот вывод в ListBox (думаю, что переделать на МЕМО труда не составит):
Код:
procedure ScanDir(StartDir: string; Mask:string; List:TStrings);
var
SearchRec : TSearchRec;
begin
if Mask = '' then Mask := '*.*';
if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
List.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
begin
List.Add(StartDir + SearchRec.Name + '\');
ScanDir(StartDir + SearchRec.Name + '\',Mask,List);
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
ScanDir('c:','',ListBox1.Items);
Label1.Caption := IntToStr(ListBox1.Items.Count);
end;
mihali4 вне форума Ответить с цитированием
Старый 17.04.2008, 23:37   #7
vitalik007
Дельфист
Форумчанин
 
Аватар для vitalik007
 
Регистрация: 14.08.2007
Сообщений: 317
По умолчанию

FAiver
Используй код как написал mihali4.Это стандартный поиск а Я решил что-нибудь оригинальное придумать
ICQ-465033557
WINDOWS CE THE BEST
vitalik007 вне форума Ответить с цитированием
Старый 18.04.2008, 08:02   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чет я не понял в чем сыр-бор. У меня код автора работает на ура.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.04.2008, 11:51   #9
GAGARIN-NEW
Познаю мир
Форумчанин Подтвердите свой е-майл
 
Аватар для GAGARIN-NEW
 
Регистрация: 05.10.2007
Сообщений: 387
По умолчанию

Код михалыча прекрасно работает . Только не пойму одного . если искать по масе "*.*" то ищет все файлы в директории и поддиректории ... а если искать по маске "*.jpg" то ищет только в текущей папке( без подкаталогов .. какю маску поставить чтобы искало к примеру жпеги в подкаталогах тоже?
---
GAGARIN-NEW вне форума Ответить с цитированием
Старый 20.04.2008, 14:16   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от GAGARIN-NEW
а если искать по маске "*.jpg" то ищет только в текущей папке( без подкаталогов .. какю маску поставить чтобы искало к примеру жпеги в подкаталогах тоже?
так потому подкаталоги и не находятся - вот, если сделаете подкаталог с расширением .JPG (например, директорию (папку) с именем MYFOLDER.JPG - то в нём тоже будет искаться ;-)))

вам нужно искать по маске *.*
а у найденных файлов проверять
if UpperCase(ExtractFileExt(Name))='.J PG' then begin
<Обработка найденного JPG файла>
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
список всех открытых файлов и папок. Teleport Общие вопросы Delphi 4 22.06.2008 11:29
Поиск папок Artificial Помощь студентам 2 16.03.2008 22:30
поиск Папок Dukalis Общие вопросы C/C++ 3 17.01.2008 20:22
Поиск файлов LeoN Общие вопросы Delphi 5 25.11.2007 22:54
поиск файлов KORN Компоненты Delphi 3 12.10.2007 05:42