2013-06-23 2 views
2

Я пытаюсь создать приложение на C++, которое будет искать все .wav-файлы на диске (включая все вложенные папки и их подпапки и т. Д.), Поиск всего диска, например, поиск антивируса на Avast и т. д.) и сохранить их в строке и сохранить в текстовый файл позже. У меня возникли проблемы, когда я выяснил, как это сделать, и я мог бы использовать некоторую помощь.C++ Найти все файлы .wav

Это то, что я сделал до сих пор, это только поиск в корневой папке диска C, и я не знаю, что делать сейчас. Я знаю, что я должен использовать какой-то цикл, но я не знаю, как на самом деле это сделать, нет логического способа, который я могу придумать.

void finddata() 
{ 
    MessageBox(NULL, "finddata called", "Started", MB_OK | MB_ICONINFORMATION); 
    WIN32_FIND_DATA FindFileData; // A pointer to the WIN32_FIND_DATA structure that receives information about a found file or directory. 
    HANDLE hFind; // Used to check the return value 
    hFind = FindFirstFile("C://*.wav", &FindFileData); 
    if(hFind == INVALID_HANDLE_VALUE) 
    { 
     MessageBox(NULL, "INVALID_HANDLE_VALUE", "Failed", MB_OK | MB_ICONINFORMATION); 
    } 
    else 
    { 
     string file; 
     file = FindFileData.cFileName; 
     file.append("|"); 
     MessageBox(NULL, file.c_str(), "YO", MB_OK | MB_ICONASTERISK); // string.c_str() to conv to LPCSTR 
     FindClose(hFind); 
    } 
} 

MessageBox в конце как раз там как тест, я удалю его позже. В настоящее время я изучаю C++, и это своего рода проект для новичков, поэтому я могу повесить его.

Кроме того, существуют ли ограничения по размеру для строкового типа данных? Благодарю.

+0

Вы используете окна в ОС? –

+0

Вы можете использовать std :: string :: max_size, чтобы увидеть максимальный размер строки std. –

+0

Да, Windows 7 64-разрядная –

ответ

2

Очевидно, что вам действительно нужен вызов FindNextFile, и повторите это, используя какой-то цикл, пока он не вернет код возврата «no more files».

Для поиска всего диска вам нужно будет искать каталоги в «текущем каталоге» (корневой каталог) и для каждого поиска в нем - вы можете сделать это либо путем рекурсивного вызова finddata (добавление имя каталога в качестве аргумента функции) или реализовать стек в коде для отслеживания того каталога, в котором вы находитесь, и какого из них «вернуться к» для следующего уровня.

Я намеренно НЕ записываю код для вас, но описываю, что вам нужно делать, поскольку вы - одно обучающее программирование. Я делал такие вещи в 1985 году или около того.

1

Рекурсивность - это путь.

Вот возможная реализация (для вдохновения, но делать это ваш собственный путь):

// Filtering by the given extension 
void AppendFile(list<string>& fileList, const string& directory, const string& fileName, const string& extFilter) 
{ 
    string fileExtension = fileName.substr(fileName.find_last_of(".") + 1); 
    if (!fileExtension.empty()) 
    { 
     // Extension doesn't match: return 
     if (extFilter.find(fileExtension) == string::npos) 
      return; 
    } 
    // If we have a match: append file to list 
    fileList.push_back(directory + fileName); 
} 

// Getting the files of the given extension recursively (or not) 
void GetFiles(list<string>& fileList, string directory, const string& extFilter, bool recursively = true) 
{ 
    string filePath; 

    directory += "\\"; 
    string filter = directory + "*"; 

    WIN32_FIND_DATA FindFileData; 
    HANDLE hFind = FindFirstFile(filter.c_str(), &FindFileData); 

    if (hFind == INVALID_HANDLE_VALUE) return; 

    do 
    { 
     // If we find a (sub-)directory 
     if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
     { 
      // Here comes the recursive call 
      if ((recursively) && (lstrcmp(FindFileData.cFileName, TEXT(".")) != 0) && (lstrcmp(FindFileData.cFileName, TEXT("..")) != 0)) 
       // The 'GetFiles()' calls itself on the sub-directory 
       GetFiles(fileList, directory + FindFileData.cFileName, extFilter); 
     } 
     else 
      // If we find a file: simply append it to the list 
      AppendFile(fileList, directory, FindFileData.cFileName, extFilter); 
    } 
    while (FindNextFile(hFind, &FindFileData) != 0); 

    FindClose(hFind); 
} 

Usage:

list<string> fileList; 
GetFiles(fileList, "C:\\root_dir", "wav"); 

for(list<string>::iterator it = fileList.begin(); it != fileList.end(); ++it) 
{ 
    cout << (*it) << endl; 
}