Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Поиск файла по имени


Автор: evgovs1991 7.11.2015, 14:06
Подскажите как можно найти файл на компьютере зная только имя...и в результате вывести его полный путь в listbox ?

Автор: Cheloveck 7.11.2015, 17:06
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364418%28v=vs.85%29.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364428%28v=vs.85%29.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365200%28v=vs.85%29.aspx
Может в VCL есть что своё...

Автор: xvr 9.11.2015, 13:05
Цитата(evgovs1991 @  7.11.2015,  14:06 Найти цитируемый пост)
Подскажите как можно найти файл на компьютере зная только имя

Можно, но искать придется очень и очень долго  smile 
Попробуйте https://msdn.microsoft.com/en-us/library/aa965362.aspx сервис - должно быть гораздо быстрее, но успех не гарантирован  smile 

Автор: chaeman 30.11.2015, 20:23
посмотри алгоритмы поиска

Автор: Doga 22.1.2016, 18:21
Привет.

Вот универсальная функция для поиска файлов по имени, расширению и др. :

Код

#include <SysUtils.hpp>
#include <Masks.hpp>

//Флаг для принудительной остановки процесса поиска
bool SearchIsStopped = false;

//FilesSearch возвращает список найденных файлов в виде объекта TStringList, 
//или NULL, если необходимые файлы не удалось обнаружить

//Аргументы:
//AnsiString ASearchFolder - целевой каталог, в котором должен быть произведён поиск файлов, напр.: "c:\\windows" 
//AnsiString ASearchMask - маска для поиска файлов, напр.: "win*.*", "*.exe", ...
//bool ASearchInSubFolders - флаг, разрешающий поиск в подкаталогах
TStringList * __fastcall FilesSearch(AnsiString ASearchFolder, AnsiString ASearchMask, bool ASearchInSubFolders)
{
  TStringList *Result = NULL;

  if (Sysutils::DirectoryExists(ASearchFolder))
  {                   
    TSearchRec  SearchRec;

    AnsiString  MaskFolderString;
    
    //Список для хранения найденных каталогов
    TStringList *FoldersList = new TStringList();
    FoldersList->Clear();

    FoldersList->Append(ASearchFolder);

    //Нормализация пути (можно использовать NormalDir(...) из RxLib или JEDI VCL)
    if (FoldersList->Strings[0][FoldersList->Strings[0].Length()] != '\\')
    {
      FoldersList->Strings[0] = FoldersList->Strings[0] + "\\";
    }

    for (int m = 0; m < FoldersList->Count; m++)
    {
      //Маска поиска - все файлы и подкаталоги
      MaskFolderString = FoldersList->Strings[m] + "*.*";
      
      //Поиск всех подкаталогов в выбраном каталоге
      for (int k = 0; ; )
      {
        if (!k)
        {
          if (FindFirst(MaskFolderString, faAnyFile, SearchRec))
          {
            FindClose(SearchRec);
            break;
          }
          else
          {
            k++;
          }
        }
        else
        {
          if (FindNext(SearchRec))
          {
            FindClose(SearchRec);
            break;
          }
        }

        //Если это подкаталог - добавляем его к списку FoldersList, если это разрешено
        if(SearchRec.Attr&faDirectory)
        {
          if(ASearchInSubFolders)
          {
            if((SearchRec.Name != ".") && (SearchRec.Name != ".."))
            {
              FoldersList->Append(AnsiString(FoldersList->Strings[m] + SearchRec.Name));

              //Нормализация пути (можно использовать NormalDir(...) из RxLib или JEDI VCL)
              if (FoldersList->Strings[FoldersList->Count - 1][FoldersList->Strings[FoldersList->Count - 1].Length()] != '\\')
              {
                FoldersList->Strings[FoldersList->Count - 1] = FoldersList->Strings[FoldersList->Count - 1] + "\\";
              }
            }
          }
        }
        //Если это нужный файл - добавляем его к выходному списку Result
        else if( !(SearchRec.Attr & (faVolumeID|faDirectory)) )
        {
          //Проверка имени файла по маске поиска
          if (MatchesMask(SearchRec.Name, ASearchMask))
          {
            if (!Result)
            {
              Result = new TStringList();
              Result->Clear();
            }
          
            Result->Append(FoldersList->Strings[m] + SearchRec.Name);
          }
        }
        
        //Обработка очереди сообщений
        Application->ProcessMessages();

        //Выход из режима поиска, если нужно
        if (SearchIsStopped)
        {
          break;
        }
      }
    }

    delete FoldersList;
  }

  return Result;  
}
 

Использование:
Код

TStringList * FilesList;

//Найдёт все EXE-файлы в каталоге c:\windows и во всех его подкаталогах
FilesList = FilesSearch("c:\\windows" , "*.exe", true);

if (FilesList)
{
  //Работа с найденными файлами...

  delete FilesList;
}

//Найдёт все начинающиеся на "win" файлы в каталоге c:\windows и во всех его подкаталогах
FilesList = FilesSearch("c:\\windows" , "win*.*", true);

if (FilesList)
{
  //Работа с найденными файлами...

  delete FilesList;
}


Функция FilesSearch для поиска файлов рекурсию не использует.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)