Добрый вечер. Нашел код который хорошо ищет файлы.
Код | #include <cstdlib> #include <iostream> #include <windows.h> using namespace std;
//функция поиска bool seek(LPCTSTR lpszFileName, BOOL bInnerFolders) { LPTSTR part; char tmp[MAX_PATH]; // temporary array char name[MAX_PATH];
HANDLE hSearch = NULL; WIN32_FIND_DATA wfd; memset(&wfd, 0, sizeof(WIN32_FIND_DATA)); //search in embeded folders for first if(bInnerFolders) { if(GetFullPathName(lpszFileName, MAX_PATH, tmp, &part) == 0) return FALSE; lstrcpy(name, part); lstrcpy(part, "*.*");
//if folder exists, down to it wfd.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; if (!((hSearch = FindFirstFile(tmp, &wfd)) == INVALID_HANDLE_VALUE)) do { //if current folder is a service folders? which no need to check if (!strncmp(wfd.cFileName, ".", 1) || !strncmp(wfd.cFileName, "..", 2)) continue; if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //if it's a folder { // making a new path char next[MAX_PATH]; if(GetFullPathName(lpszFileName, MAX_PATH, next, &part) == 0) return FALSE; lstrcpy(part, wfd.cFileName); lstrcat(next, "\\"); cout << next << endl; lstrcat(next, name); //recourse down seek(next, TRUE); } } while (FindNextFile(hSearch, &wfd)); //finding next file in folder FindClose (hSearch); // closing a search descriptor } if ((hSearch = FindFirstFile(lpszFileName, &wfd)) == INVALID_HANDLE_VALUE) return TRUE; do if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) // is it's a file { char file[MAX_PATH]; if(GetFullPathName(lpszFileName, MAX_PATH, file, &part) == 0) return FALSE; lstrcpy(part, wfd.cFileName); //adding its to a result list cout << file << endl; } while (FindNextFile(hSearch, &wfd)); // next file in folder FindClose (hSearch); // close search descriptor
return TRUE; } //главная функция int main() { /* Вызываем функцию seek, указав ей искать все *.txt файлы на диске C:\, так же второй параметр, false, говорит функции не заглядывать во вложенные каталоги, а искать только в корневом). Если задать этот параметр как true - программа начнет перебирать все каталоги. Так же мы проверяем значение, которое возвращает функция, если это false - выводим сообщение об ошибке. */ if(!seek("c:\\*.txt", true )) cout << "Searching failed" << endl; return 0; }
|
Но как видно из кода он ищет на одном диске один вид файлов, но по всему дереву каталогов. Он нехорошо выводит найденные файлы вперемешку с пустыми папками подскажите как это исправить? И главное как устроить прохождение поиска по всем дискам и увеличить количество расширений в маске поиска? |