Res := FindFirst('Models\*\ЛМ-68.md', faAnyFile, F);
Не находит.
Если сказать тупо:
Res := FindFirst('Models\ЛМ, ЛВС\ЛМ-68.md', faAnyFile, F);
То да, он честно находит ЛМ-68.md
Но название папки-то заранее не известно, вот в чём суть.
FindFirst - вообще очень глючна, причем это не проблема Дельфи, это проблема Windows: http://qc.embarcadero.com/wc/qcmain.aspx/qcmain.aspx?d=2737
Что касается Дельфи, то там явно сказано, что
Да я вообще понимаю, что эта функция - часть ОС.
Но мне что тогда делать-то?
И ещё, немного оффтоп - как известные файловые менеджеры определяют, является ли то, что скрывается под именем, каталогом, или просто файлом? Финдфирст тупо смотрит на наличие точки в имени, то есть он не катит.
Но для этого надо написать поиск папок, а этого я тоже не умею, так как параметр faDir выдаст мне просто названия файлов без точки. Если в назвинии папки окажется точка, то как я её вычислю?
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);
Сделал по аналогии, заработало, спасибо.
У меня, помню, постоянно на строке FindClose(SRec); ошибка выскакивала, если в консоли вышеприведенное использовать.
Не знаю, только что гонял в консоли, работает, зараза... А чего за ошибку-то выдавало, не проверял?
В такой процедуре в консоли:
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;
SysUtils.FindClose(SearchRec);, но вызывать ее надо. Иначе получишь утечку ресурсов...
А в Uses поменять местами SysUtils и Windows (чтоб SysUtils был подключен ПОСЛЕ Windows) не догадался?