IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Поиск файла, название известно, поддиректория - нет., Маска не срабатывает.
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Res := FindFirst('Models\*\ЛМ-68.md', faAnyFile, F);
Не находит.
Если сказать тупо:
Res := FindFirst('Models\ЛМ, ЛВС\ЛМ-68.md', faAnyFile, F);
То да, он честно находит ЛМ-68.md
Но название папки-то заранее не известно, вот в чём суть.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






FindFirst - вообще очень глючна, причем это не проблема Дельфи, это проблема Windows: Embarcadero QC: FindFirst/FindNext wildcard error

Что касается Дельфи, то там явно сказано, что
Цитата
The FileMask may contain a path, as well as a file name. The file name may contain wild cards:

? : Match any one character
* : Match 0, 1 or more characters
, то есть, шаблоны допустимы только в имени файла, но не в пути к нему.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Да я вообще понимаю, что эта функция - часть ОС.
Но мне что тогда делать-то?

И ещё, немного оффтоп - как известные файловые менеджеры определяют, является ли то, что скрывается под именем, каталогом, или просто файлом? Финдфирст тупо смотрит на наличие точки в имени, то есть он не катит.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Но мне что тогда делать-то?
Я бы, наверное, написал функцию, проверяющую, подходит ли имя файла под заданный шаблон. И ищи файлы рекурсивно во всех папках, начиная с той, что ДО звездочки. Нашел - проверил полное имя. Подходит под шаблон - хорошо, не подходит - ищи дальше...



 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Но для этого надо написать поиск папок, а этого я тоже не умею, так как параметр faDir выдаст мне просто названия файлов без точки. Если в назвинии папки окажется точка, то как я её вычислю?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Но для этого надо написать поиск папок, а этого я тоже не умею так как параметр faDir выдаст мне просто названия файлов без точки
А не надо искать с faDir, ищи с faAnyFile и потом проверяй поле SearchRec.Attr ...

Кстати, ничего писать самому уже не надо (в смысле, соответствие маске), все есть в Дельфи...
uses { ... ,} Masks;

procedure FindFiles(const Path, Mask: String; FileList: TStrings);
var
SRec: TSearchRec;
Dir: string;
begin
Dir := IncludeTrailingPathDelimiter(Path);
if FindFirst(Dir + '*.*', faAnyFile, SRec) <> 0 then Exit;
try
repeat
if (SRec.Name = '.') or (SRec.Name = '..') then Continue;
if (SRec.Attr and faDirectory) = faDirectory then // Вот проверка, папка или нет
FindFiles(Dir + SRec.Name, Mask, FileList)
else
begin
if MatchesMask(Dir + SRec.Name, Mask) then
begin
FileList.Add(Dir + SRec.Name);
end;
end;
until FindNext(SRec) <> 0;
finally
FindClose(SRec);
end;
end;

// Вызывать так:
FindFiles('F:\Programs', 'F:\Programs\*\bcd.txt', Memo1.Lines);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Сделал по аналогии, заработало, спасибо.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


У меня, помню, постоянно на строке FindClose(SRec); ошибка выскакивала, если в консоли вышеприведенное использовать.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Не знаю, только что гонял в консоли, работает, зараза... А чего за ошибку-то выдавало, не проверял?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


В такой процедуре в консоли:

Procedure ScanDir(Dir:string);
var
searchrec:tsearchrec;
begin
if Dir<>'' then if Dir[length(Dir)]<>'\' then Dir:=Dir+'\';
if FindFirst(Dir+'*.*', faAnyFile, SearchRec)=0 then
repeat
if (SearchRec.name='.') or (SearchRec.name='..') then continue;
if (SearchRec.Attr and faDirectory)<>0 then
ScanDir(Dir+SearchRec.name)
else
if extractfileext(Dir+SearchRec.name)='.qhf' then zip1.AddFiles(Dir+SearchRec.name);
if searchrec.name='owner.mdb' then zip1.AddFiles(Dir+SearchRec.name);
until FindNext(SearchRec)<>0;
FindClose(SearchRec); //<------
end;


На выделенной строке выдаёт Incompatible types: 'Cardinal' and 'TSearchRec'. Я эту строку просто "закомментировывал", и ничего страшного не происходило:)


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Цитата
На выделенной строке выдаёт Incompatible types: 'Cardinal' and 'TSearchRec'
А в Uses поменять местами SysUtils и Windows (чтоб SysUtils был подключен ПОСЛЕ Windows) не догадался? Есть же WinAPI-функция FindClose, которая получает хендл файла. А в Паскаль/Дельфи есть не очень приятная особенность: описание функции в модуле подключенном ПОЗЖЕ перекрывает описание, имеющееся в модуле, подключенном РАНЬШЕ. Так что либо как я написал выше (менять модули местами при подключении), либо
SysUtils.FindClose(SearchRec);
, но вызывать ее надо. Иначе получишь утечку ресурсов...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


А в Uses поменять местами SysUtils и Windows (чтоб SysUtils был подключен ПОСЛЕ Windows) не догадался? 


Такую апи-функцию знаю, но всё равно ни за что бы не догадался:)


Сообщение отредактировано: Unconnected -


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.05.2024 3:59
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name