Столкнулся с интересным поведением связки FindFirstFile + FindNextFile
Сам проект на С++, но для быстрого воспроизведения набросал пример на Делфи
(нужна юникодовая версия, но мультибайтная ведет себя точно так же)
procedure TForm1.Button1Click(Sender: TObject);
var
l_find_data : TWin32FindDataW;
l_hfind : THandle;
sw : widestring;
begin
Memo1.Lines.Clear;
sw := widestring( '\\?\' + ExtractFileDir( ParamStr( 0 ) ) + '\' + Edit1.text );
l_hfind := FindFirstFileW( PWideChar( sw ), l_find_data );
if not( l_hfind = cardinal( -1 ) ) then
begin
repeat
Memo1.Lines.Add( string( l_find_data.cFileName ) );
until( FindNextFileW( l_hfind, l_find_data ) = FALSE );
Windows.FindClose( l_hfind );
end;
end;
Суть простая — задаю маску и хочу получить список файлов, но вот тут то и притаился зверек с ценным мехом (или моё недопонимание WinAPI)
по маске *.pas мне находятся "лишние" файлы (действительно существующие в папке, но которые не должны отображаться в результатах поиска)
Unit1.pas
Unit1.pas_
Unit1.pas1
причем, если задаю *.pa? — результат тот же, ОС — WinXP SP3
Заранее благодарю за подсказанное решение.
T>Суть простая — задаю маску и хочу получить список файлов, но вот тут то и притаился зверек с ценным мехом (или моё недопонимание WinAPI)
T>по маске *.pas мне находятся "лишние" файлы (действительно существующие в папке, но которые не должны отображаться в результатах поиска)
T>Unit1.pas
T>Unit1.pas_
T>Unit1.pas1
T>причем, если задаю *.pa? — результат тот же, ОС — WinXP SP3
T>Заранее благодарю за подсказанное решение.
сделай dir /x и узри короткие имена которые имеют Unit1.pas_ и Unit1.pas1
Здравствуйте, ononim, Вы писали:
O>сделай dir /x и узри короткие имена которые имеют Unit1.pas_ и Unit1.pas1
Намек понял, спасибо.
Я так понимаю, в такой ситуации, подобное можно отфильтровывать по l_find_data.cAlternateFileName[0] = #0, по крайней мере — работает ?
O>>сделай dir /x и узри короткие имена которые имеют Unit1.pas_ и Unit1.pas1
T>Намек понял, спасибо.
T>Я так понимаю, в такой ситуации, подобное можно отфильтровывать по l_find_data.cAlternateFileName[0] = #0, по крайней мере — работает ?
В такой ситуации, если перфоманс не давит — лучше листить все файлы и фильтровать их вручную к примеру с помощью PathMatchSpec.