Авторизация

Логин: Пароль:
Регистрация Забыли свой пароль?

Поиск файла

Страницы: 1
Поиск файла
Подскажите как можно найти файл если папка в которой он лежит неизвестна. Если я пишу так
Код
Res := FindFirst('Models\*\file.dat', faAnyFile, F);

То он ничего не находит. А если так
Код
Res := FindFirst('Models\dir\file.dat', faAnyFile, F);

Находит, но я же не знаю в какой дериктории нужно искать.
FindFirst вообще очень глючная функция, причем это проблема windows, а не delphi.
Да я понимаю, но проблему же нужно решать
В Delphi явно написано
Цитата
The FileMask may contain a path, as well as a file name. The file name may contain wild cards:

То есть маска допустима в имени файл, но никак не в пути к нему. Для решения нужно написать свою функцию поиска.
Используйте рекурсивный поиск по всем папкам.
Но это же нужно найти каждую директорию,а я тоже не знаю как это сделать.
Если не ошибаюсь для этого нужно заменить faAny на faDir
Ошибаетесь, нужно использовать именно faAnyFile и потом проверять поле SearchRec.Attr
Почему?
Изменено: Михаил Сидоров - 11.02.2010 01:26:27
Потому что 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);
вообще рекомендуют использовать именно:
Код
function FindFirst(const Path: string; Attr: Integer;
  var F: TSearchRec): Integer;

к примеру для поиска с любым именем в корне диска С:
Path:='c:\*.*';
Изменено: kenny - 24.03.2010 00:09:33
свободный страннык
к тому же с помощью attr можно задать атрибут файла:
faReadOnly - файлы, у которых установлен аттрибут "Только для чтения".
faHidden - файлы, у которых установлен атрибут "Скрытые".
faSysFile - файлы, у которых установлен атрибут "Системный".
faArchive - файлы, у которых установлен атрибут "Архивный".
faDirectory - директория. То есть поиск поддиректорий в директории.
faAnyFile - любой файл (в том числе и faDirectory, и faVolumeID)
возможно если искать по имеющемуся атрибуту вы возможно сможете реализовать свою задумку
пока ты не доволен жизнью - она проходит...
А в чем собственно проблема, то используете findferst и findnext. Раз так вышло, что мы не знаем где файл,то придется обходить весь диск целиком
Страницы: 1
Читают тему (гостей: 2, пользователей: 0, из них скрытых: 0)