Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск файлов

290
02 января 2013 года
Patr1ot
458 / / 09.02.2008
Добрый день!
Прошу помочь с одной проблемой, в общем нужно организовать поиск файла на диске, в начальном каталоге мой код файл находит, делаю рекурсивный вызов функции для поиска в папках искомого файла, не работает, в чем проблема не могу разобраться, подскажите пожалуйста.
мой код:

Код:
void TService1::Findses(AnsiString Files, AnsiString Dir)
{
TSearchRec SR;

 
TStringList * Find = new TStringList();
Find->Clear();

// задание условий поиска и начало поиска
if(FindFirst(Dir+Files,faAnyFile+faDirectory,SR)==0)
{
    do
{




    if(SR.Attr & faDirectory) //проверяю, папка ли это
     {
     if(SR.Name==".")//проверяю корректность ее имени
     {
     }
     if(SR.Name=="..")//проверяю корректность ее имени
     {
     }
     Findses(Files,Dir+SR.Name+"\\");//собственно рекурсивный запрос, добавляю к искомому каталогу
                                         //новый найденный каталог и повторяю выполнение поиска

     }
     else
     {
      Find->Add(Dir+"\n"+SR.Name);
      if(SR.Name!="")
      {
      Find->SaveToFile(dl+":\\save.txt");
      }
     }
     }



while (FindNext(SR) == 0);


FindClose(SR);

 delete Find;
}
}
1
03 января 2013 года
kot_
7.3K / / 20.01.2000
Во первых:

Код:
if(SR.Attr & faDirectory && (SR.Name!="." &&  SR.Name!="..")) //если нашли папку, то проверяем что это не ссылка на текущий или родительский каталог
     {
       Findses(Files,Dir+SR.Name+"\\");//собственно рекурсивный запрос, добавляю к искомому каталогу
                                         //новый найденный каталог и повторяю выполнение поиска

     }
 else if(SR.Name=="." ||  SR.Name=="..") continue;//это ссылка на текущий или родительский каталог
 else{
      Find->Add(Dir+"\n"+SR.Name);
      if(SR.Name!="")
      {
      Find->SaveToFile(dl+":\\save.txt");
      }
}
Во вторых - фактическая ошибка - насколько я понимаю в Files находится маска поиска. Т.е. если директории ей не сосуществуют, то в структуру поиска они и не попадут. Вот и причина. Что бы искало правильно примерно так:

Код:
if(FindFirst(Dir+"*.*",faAnyFile+faDirectory,SR)==0){
 do{
if(SR.Attr & faDirectory && (SR.Name!="." &&  SR.Name!="..")) //если нашли папку, то проверяем что это не ссылка на текущий или родительский каталог
     {
       Findses(Files,Dir+SR.Name+"\\");//собственно рекурсивный запрос, добавляю к искомому каталогу
                                         //новый найденный каталог и повторяю выполнение поиска

     }
 else if(SR.Name=="." ||  SR.Name=="..") continue;//это ссылка на текущий или родительский каталог
 else{
  if(SR.Name.Pos(Files) > 0)
      Find->Add(Dir+"\n"+SR.Name);
      Find->SaveToFile(dl+":\\save.txt");
     
 }
}while(FindNext(SR)==0)
}
Код написан для примера - как проверять, соотвествует ли имя файла маске поиска - думай сам. Ну и сам цикл можно еще оптимизировать.
392
02 января 2013 года
cronya
421 / / 03.01.2009
на с# так :)

Код:
string path = "D:\\Temp";
List<string> Dirs = new List<string>(Directory.EnumerateDirectories(path,"*",SearchOption.AllDirectories));
string name = "Temp.txt";
string res = string.Empty;
foreach (string dir in Dirs)
{
    DirectoryInfo Info = new DirectoryInfo(dir);
    IEnumerable<FileInfo> Files = from f in Info.EnumerateFiles()
                where f.Name == name
                select f;
    foreach (FileInfo f in Files)
    {
        res += f.FullName + "\n";
    }                
}            
MessageBox.Show(res);
1
03 января 2013 года
kot_
7.3K / / 20.01.2000
Цитата: kot_
Т.е. если директории ей не сосуществуют...


не соответствуют конечно же имелось ввиду

290
03 января 2013 года
Patr1ot
458 / / 09.02.2008
Спасибо, все дошло до меня) с температурой как то не очень кодится)
1
03 января 2013 года
kot_
7.3K / / 20.01.2000
И кстати, что бы не путаться с скобками и пр.


Код:
TSearchRec SR;
TStringList * Find;
try{
   
    if(FindFirst(Dir+"*.*",faAnyFile+faDirectory,SR)!=0) return;
                Find = new TStringList; //Если ничего нет - нет смысла создавать список
                do{
            //тут все
        }while(FindNext(SR)==0)
           
       
}
__finally{
 if(Find) delete Find;
 FindClose(SR);
}
Ты же все равно пишешь на билдере, так используй все нормальные возможности языка.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог