FinfFirstFile и неверный результат поиска ?
От: Tujh Голландия  
Дата: 01.02.11 08:36
Оценка:
Столкнулся с интересным поведением связки 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

Заранее благодарю за подсказанное решение.
Re: FinfFirstFile и неверный результат поиска ?
От: ononim  
Дата: 01.02.11 08:38
Оценка: 3 (1)
T>Суть простая — задаю маску и хочу получить список файлов, но вот тут то и притаился зверек с ценным мехом (или моё недопонимание WinAPI)
T>по маске *.pas мне находятся "лишние" файлы (действительно существующие в папке, но которые не должны отображаться в результатах поиска)
T>Unit1.pas
T>Unit1.pas_
T>Unit1.pas1

T>причем, если задаю *.pa? — результат тот же, ОС — WinXP SP3

T>Заранее благодарю за подсказанное решение.
сделай dir /x и узри короткие имена которые имеют Unit1.pas_ и Unit1.pas1
Как много веселых ребят, и все делают велосипед...
Re[2]: FinfFirstFile и неверный результат поиска ?
От: Tujh Голландия  
Дата: 01.02.11 09:23
Оценка:
Здравствуйте, ononim, Вы писали:
O>сделай dir /x и узри короткие имена которые имеют Unit1.pas_ и Unit1.pas1
Намек понял, спасибо.
Я так понимаю, в такой ситуации, подобное можно отфильтровывать по l_find_data.cAlternateFileName[0] = #0, по крайней мере — работает ?
Re[3]: FinfFirstFile и неверный результат поиска ?
От: ononim  
Дата: 01.02.11 09:27
Оценка: +1
O>>сделай dir /x и узри короткие имена которые имеют Unit1.pas_ и Unit1.pas1
T>Намек понял, спасибо.
T>Я так понимаю, в такой ситуации, подобное можно отфильтровывать по l_find_data.cAlternateFileName[0] = #0, по крайней мере — работает ?
В такой ситуации, если перфоманс не давит — лучше листить все файлы и фильтровать их вручную к примеру с помощью PathMatchSpec.
Как много веселых ребят, и все делают велосипед...
Re[4]: FinfFirstFile и неверный результат поиска ?
От: Tujh Голландия  
Дата: 01.02.11 10:49
Оценка:
Здравствуйте, ononim, Вы писали:
O>В такой ситуации, если перфоманс не давит — лучше листить все файлы и фильтровать их вручную к примеру с помощью PathMatchSpec.
Не давит.
Спасибо за помощь !
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.