2010-07-29 2 views
12

Мне нужен способ поиска на компьютере таких файлов, как Проводник. Я хочу, чтобы моя программа на поиск позволяла говорить на жестком диске c :. мне нужно его для поиска C: \ для папок и файлов (только те, которые вы могли видеть в c: \ then, если пользователь нажимает на файл в списке, например, тест на папку (C: \ test), он будет искать тест и пусть пользователю видеть какие файлы/папки в немкак искать компьютер для файлов и папок

+0

И ваш вопрос ... что? –

+0

Это специфичная для платформы проблема. Вы в Windows, Unix и т. Д.? – TreDubZedd

+2

Если он ссылается на свой жесткий диск как 'C:' и каталоги в виде «папок», то вполне очевидно, что может быть его платформой ... ;-) Ой, и отделитель пути обратной косой черты также отдает его. –

ответ

14

Поскольку вы упомянули окна, самый прямой WinAPI способ сделать это с FindFirstFile и FindNextFile функций.

Редактировать: Вот пример, который показывает вам, как перечислять все файлы/папки в каталоге.

#include <Windows.h> 
#include <iostream> 


int main() 
{ 
    WIN32_FIND_DATA file; 
    HANDLE search_handle=FindFirstFile(L"C:\\*",&file); 
    if (search_handle) 
    { 
     do 
     { 
      std::wcout << file.cFileName << std::endl; 
     }while(FindNextFile(search_handle,&file)); 
     FindClose(search_handle); 

    } 

} 
+0

это только находит файлы правильно? Мне нужны папки и файлы. – blood

+0

Нет, он находит оба. Он также позволяет вам задавать критерии поиска для поиска файлов/папок. – monoceres

+0

Я также добавил пример – monoceres

2

вы можете использовать Directory членов класса, чтобы сделать это с помощью C# или управляемом C++ обратитесь к следующей MSDN статье:..

http://support.microsoft.com/kb/307009

Если вы хотите использовать C++ с MFC вы можете использовать CFileFind

http://msdn.microsoft.com/en-us/library/f33e1618%28v=VS.80%29.aspx

Вам нужно будет предоставить свое собственное окно просмотра, чтобы представить дерево файловой системы.

Или вы можете использовать один из элементов управления каталогом/файлом, чтобы сделать это для вас.

+0

Это использует .Net и требует использования C++/CLI. –

+0

@Georg: Спасибо за разъяснение. Я добавил дополнительную информацию, если он хочет использовать C++ без .NET. –

+0

: | я не вижу информацию – blood

4

Это зависит от ОС. SO вопрос

How can I get a list of files in a directory using C or C++?

обрабатывает эту проблему наилучшим образом. Вы можете скачать DIRENT здесь.

Теперь, когда у вас есть это, я бы рекомендовал рекурсивно искать файл с помощью алгоритма /BFS. Вы можете предположить, что вся структура каталогов - это tree, где каждый файл является листовым узлом, и каждый подкаталог является внутренним узлом.

Так все, что вам нужно сделать, это,

  1. Получить список файлов/папок в директории с такой функцией, как:
    void getFilesFolders(vector<string> & dir_list, const string & folder_name)
  2. Если это каталог, перейдите на 1 с directory name
  3. Если это файл, прекратите работу, если это файл, который вы ищете, иначе перейдите к следующему файлу.
+0

Как я могу получить список файлов в каталоге с помощью C или C++? это хорошо, но код я не могу работать. только код Брайана Р. Бонди самый последний из его, но он только находит файлы частью того, что я хотел, а также я не могу найти, как это работает, поэтому я не могу редактировать его для своей программы :( – blood

+0

, играя с dirent to посмотрите, работает ли он, вернемся к вам на этом – blood

+0

uhh я не могу получить dirent, я его загружаю, но он распаковывает файлы в формате .9 и все это. Я пропустил что-то, потому что я только что загрузил его со своей ссылки – blood

2

boost :: файловая система может быть кросс-платформенным решением для этого (обратите внимание на такие функции в нем).

+2

Я не очень хотел, чтобы программное обеспечение сторонних разработчиков – blood

+1

. На самом деле это не программное обеспечение сторонних разработчиков, но по сравнению с iostream, которое является одним из C++, меньшие большие возможности). – CashCow

2
#include <Windows.h> 
#include <iostream> 


int FindF(char* pDirectory) 
{ 
    char szFindPath[MAX_PATH] = {0}; 
    strcpy(szFindPath, pDirectory); 
    strcat(szFindPath, "\\*"); 
    WIN32_FIND_DATA file; 
    HANDLE search_handle=FindFirstFile(szFindPath,&file); 
    if (search_handle) 
    { 
     do 
     { 
      if(file.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) 
      { 
       strcpy(szFindPath, pDirectory); 
       strcat(szFindPath, "\\"); 
       strcat(szFindPath, file.cFileName); 
       FindF(szFindPath); 
      } 
      std::wcout << file.cFileName << std::endl; 
     }while(FindNextFile(search_handle,&file)); 
     CloseHandle(search_handle); 

    } 

} 
+0

Это почти хорошее решение, отличное от 1. В основном это C, но вы вставляете iostream, чтобы писать на C с помощью iostream ... Если вы хотите писать на C++, я бы хотя бы использовал std :: string. Ваша настоящая серьезная ошибка - вы не проверяете «точки», поэтому ваши будут рекурсивно (или, скорее всего, пострадают от названия этого сайта). – CashCow

+0

Используйте FindClose(), чтобы закрыть дескриптор, открытый с помощью FindFirstFile(). CloseHandle() выкинет «недействительный дескриптор» в режиме отладки. – NoAngel

1

Для этого не нужно использовать стороннюю библиотеку. Это короткая независимая функция, которая перечисляет все файлы (с их путями) в каталоге, включая файлы поддиректориев. std::string folderName должен заканчиваться \, и если вы хотите перечислить все файлы на компьютере, просто создайте цикл в функции вызова вместе с GetLogicalDriveStrings (он возвращает строки с \, поэтому в этом случае это не может быть более удобно).

void FindAllFiles(std::string folderName) 
{ 
    WIN32_FIND_DATA FileData; 
    std::string folderNameWithSt = folderName + "*"; 
    HANDLE FirstFile = FindFirstFile(folderNameWithSt.c_str(), &FileData); 

    if (FirstFile != INVALID_HANDLE_VALUE) { 
     do { 
      if (strcmp(FileData.cFileName, ".") != 0 && strcmp(FileData.cFileName, "..") != 0) 
      { 
       if(FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
       { 
        std::string NewPath = folderName + FileData.cFileName; 
        NewPath = NewPath + "\\"; 

        FindAllFiles(NewPath); 
       } 
       else 
       { 
        std::cout /*<< folderName*/ << FileData.cFileName << std::endl; 
       } 
      } 
     } while(FindNextFile(FirstFile, &FileData)); 
    } 
} 

Это ASCII версия, помните, что файлы и папки могут быть названы в Unicode

+1

Мне просто интересно, не могли бы вы объяснить, какие преимущества по сравнению с FindFile, пожалуйста? (и, кстати, не должно быть ASCII или ANSI?) –