![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск файлов [D7, WinXP]
User © (2008-06-23 18:52:00)Возвращаясь к 'избитой' теме ... Поиск файлов по схеме, предложенной в FAQ, работает хорошо только для случаев:
1 - нужно найти ВСЕфайлы;
2 - нужно найти файлы определенного ( одного) типа при условии, что хотябы один такой файл находитсяв искомом (начальном) каталоге - условие
if (FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0) then ...
не выполняется, если файл не найден ...
В остальных случаях (, у меня, во всяком случае) не работает.
То есть, путей решения для решения такой задачи, как поиск файлов определенных расширений ( предположим, '*.txt; *.rtf, *.doc') в указанном каталоге (с вложенными папками, и не обязательно содержащий файлы - например, корневой) я не нашел ...
Буду признателен за помощь, может кому еще сгодиться ...
Тын-Дын (2008-06-24 10:15:00) [1]
> User (23.06.08 23:02) [23]
> за ссылку спасибо, буду посматривать ...
> ... пример, действительно рабочий, но для моего случая предпочтительнее
> вариант Тын-Дына, т.к. можно одновременно искать несколько
> типов файлов ...
Это пример, написанный "на коленках". Оптимизировать ещё нужно.
User (2008-06-23 23:02:00) [2]за ссылку спасибо, буду посматривать ...
... пример, действительно рабочий, но для моего случая предпочтительнее вариант Тын-Дына, т.к. можно одновременно искать несколько типов файлов ...
Anatoly Podgoretsky (2008-06-23 22:50:00) [3]http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N157
Anatoly Podgoretsky (2008-06-23 22:48:00) [4]> User (23.06.2008 22:35:20) [20]
Ну все правильно, а какое возражение есть, если же указаное не устраивает, то смотри FAQ из ФИДО на моем сайте, там есть поиск независимый от масок.
User (2008-06-23 22:35:00) [5]
> 2 Anatoly Podgoretsky
> www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=1015254946&n=19
>
> = Как получить список файлов со всеми подкаталогами
> ...
> Пример вызова, параметры
> 1. имя папки
> 2. маска, по умолчанию *.*
> 3. хранилище для резульатат,
> любой наследник от TString, например TStringList
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> ListBox1.Items.Clear;
> ScanDir('c:','',ListBox1.Items);
> Label1.Caption := IntToStr (ListBox1.Items.Count);
> end;
>
> С уважением
> Анатолий Подгорецкий
... исчерпывающе ...
Anatoly Podgoretsky (2008-06-23 22:26:00) [6]> User (23.06.2008 22:16:18) [18]
> Вопрос же был по FAQ, значит там ошибка!
Что бы это утверждать нужно видеть текст статьи, но я думаю, что ты ее просто не понял, выдал желаемое за действительное.
Хотя сказать точно можно будет только после приведения описания/текста статьи в FAQ
User (2008-06-23 22:16:00) [7]
> Нет разницы между папкой и файлом, кроме аттрибута.
> Маска не позволяет тебе войти ни в одну папку кроме *.pas
> в соответствии с правилами работы файловых систем ДОС и
> его наследников.
- а я о чем, см:
> функция из FAQ, без изменений - при '' (по умолчанию '*.
> *') рубит, при других комбинациях - ищет только в указанном
> каталоге
, а Вы
> Неправда, неправда
Вопрос же был по FAQ, значит там ошибка!
>В справке есть и подробное описание, и пример -
>почему бы не заглянуть туда?
... можно, заглядывал, но на счет атрибутов 'осенило' только после трассировки ...
Всем спасибо за внимание! Код Тын-Дына можно переносить в FAQ.
Если нет никаких замечаний, думаю тему можно закрывать. Благодарю.
Юрий Зотов (2008-06-23 22:06:00) [8]> User (23.06.08 21:52) [15]
> создал папку 'Papka.pas', впихнул туда несколько пас-ов - нашел (в
> программе) и эту папку, и файлы в нем, и только!
И что тут странного? Что должен был найти, то и нашел. В чем проблема-то?
В справке есть и подробное описание, и пример - почему бы не заглянуть туда?
Anatoly Podgoretsky (2008-06-23 22:04:00) [9]> User (23.06.2008 21:52:15) [15]
Нет разницы между папкой и файлом, кроме аттрибута.
Маска не позволяет тебе войти ни в одну папку кроме *.pas в соответствии с правилами работы файловых систем ДОС и его наследников.
Логику работы файловых систем ты не понимаешь.
User (2008-06-23 21:52:00) [10]2 Тын-Дыноно!
2 Anatoly Podgoretsky
> Направильно пользуешься FindFirst/FindNext/FindClose.
Причем тут знание ДОСа?, если FindFirst/FindNext устанавливает атрибуты по 'первому случаю' - директория в случае '*.*'найдется (SearchRec.Attr = faDirectory) , но врядли найдется директория '*.pas', или аналогичная. По приколу попробывал - создал папку 'Papka.pas', впихнул туда несколько пас-ов - нашел (в программе) и эту папку, и файлы в нем, и только!
Тын-Дын (2008-06-23 21:37:00) [11]
> User (23.06.08 21:22) [12]
Направильно пользуешься FindFirst/FindNext/FindClose.
Держи пример, адаптированный под твою задачу.
function GetFiles(const aPath: String;MasksStr: String;aListFile: TStrings): Boolean;
var
SR: TSearchRec;
tPath: String;
LMask: TStringList;
i: Integer;
begin
LMask := TStringList.Create;
try
{$WARN SYMBOL_PLATFORM OFF}
tPath := IncludeTrailingBackSlash(aPath);
{$WARN SYMBOL_PLATFORM ON}
Result := True;
try
LMask.Delimiter := ';';
LMask.DelimitedText := MasksSTr;
if FindFirst(tPath+'*.*',faAnyFile,SR)=0 then
begin
try
repeat
if (SR.Name='.') or (SR.Name='..') then Continue;
if (SR.Attr and faDirectory)<>faDirectory then
begin
for i :=0 to LMask.Count-1 do
begin
if MatchesMask(SR.Name,LMask[i]) then
begin
aListFile.Add(tPath+SR.Name);
Break;
end;
end;
end
else GetFiles(tPath+SR.Name,MasksStr,aListFile);
until FindNext(SR)<>0;
finally
Sysutils.FindClose(SR);
end;
end;
except
Result := False;
end;
finally
LMask.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetFiles('c:\','*.pas;*.dpr',Memo1.Lines);
end;
Anatoly Podgoretsky (2008-06-23 21:34:00) [12]Ни фига ты не понимаешь ДОС, совсем не понимаешь, отсюда и твои проблемы. По другому - ты в логике не разбираешься. Все работает в соответствии с твоей логикой, сказано обрабатывать маску *.pas, а папком в таком формате наверно нет.
Если и это http://www.podgoretsky.com/ftp/Docs/Delphi/FAQ/ru.delphi.html#N157тебе не поможет, то я не знаю, что с тобой делать, разве в лес послать.
User (2008-06-23 21:22:00) [13]... 'пересел' с Delphi 2006 на D7 - те же ...
имею папка 'Borland Delphi Projects', содержащую около десятка вложенных папок (те, в свою очередь, также имеют по несколько вложеных папок); в каждой папке, как минимум - один файл '*.pas'...
запускаю в пошаговом режиме, указав стартовой указанную папку, - прохожу
if (SearchRec.Attr and faDirectory) <> faDirectory
then List.Add(StartDir + SearchRec.Name)
несколько раз (кол-во пас-ов минус один), а в
else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')
then begin
никак ...
При '*.*' проходит все участки, тоесть (SearchRec.Attr and faDirectory) <> faDirectoryпри расширении, отличном от * почему-то(?) не работает.
> А тут не наблюдается вторая маска, поэтому утверждение "поиск
> ведется только по первой маске" не имеет смысла.
- относится к
> ..., и можно, наверное наваять следующее...
> Без понимания ДОС у тебя ничего не получится, ну разве кто
> то даст тебе готовый код, но можно и оставить это в стороне,
> как то все равно, особенно раз ты сам сопротивляешься
Да понимаю я ДОСе в достаточном объёме ...
Anatoly Podgoretsky (2008-06-23 19:49:00) [14]Без понимания ДОС у тебя ничего не получится, ну разве кто то даст тебе готовый код, но можно и оставить это в стороне, как то все равно, особенно раз ты сам сопротивляешься.
Anatoly Podgoretsky (2008-06-23 19:47:00) [15]А тут не наблюдается вторая маска, поэтому утверждение "поиск ведется только по первой маске" не имеет смысла. В приведеном коде нет никаких ошибок, все работает в соответствии с логикой, будут искаться файлы с маской *.pas и ничего более.
User (2008-06-23 19:33:00) [16]
> но автор к сожалению совсем не понимает принципов работы
> ДОС и ее наследников.
- оставим в стороне мои понимания ДОС и, тем более, наследников - если это ко мне... взяв готовый кусок и применив к своей задаче, я не получил ожидаемого результата :-(
На счет варианта в [3] - поиск ведется только по первой маске - к слову ...
User (2008-06-23 19:27:00) [17]2 Anatoly Podgoretsky
www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=1015254946&n=19
> Неправда
... таки да, вот кусок:
...
GetDir(0, cDir); // получить имя текущего каталога
if cDir[length(cDir)] '\' then cDir := cDir+'\';
ListBox1.Items.Clear;
ScanDir(cDir, '*.pas', ListBox1.Items);
...
, функция из FAQ, без изменений - при '' (по умолчанию '*.*') рубит, при других комбинациях - ищет только в указанном каталоге ...
Anatoly Podgoretsky (2008-06-23 19:20:00) [18]
> а с какой радости он должен хотеть?
Он всегда хочет, если это хотение подтверждено маской и правами, но автор к сожалению совсем не понимает принципов работы ДОС и ее наследников.
Anatoly Podgoretsky (2008-06-23 19:17:00) [19]
> для маски, отличной от '*.*' поиск осуществляется только
> в искомом каталоге ...
Неправда
Anatoly Podgoretsky (2008-06-23 19:16:00) [20]Не понятно на какой FAQ ты ссылаешься, они разные бывают, хорошие и так себе.