2013-08-07 3 views
1

У меня есть программа, которая успешно ищет файлы определенного расширения на определенном диске (я пользуюсь окнами), скажем, это «C: \», а затем печатать эти файлы на консоли , теперь я хочу обобщить свою программу. я хочу, чтобы моя программа будет искать во всех разделах (диски) .. как я могу это сделать .. какую функцию должен я use..here моего пример коданайти файлы на весь жесткий диск

int SearchDirectory(std::vector<std::string> &refvecFiles, 
       const std::string  &refcstrRootDirectory, 
       const std::string  &refcstrExtension, 
       bool      bSearchSubdirectories = true) 
{ 
    std::string  strFilePath;    // Filepath 
    std::string  strPattern;    // Pattern 
    std::string  strExtension;   // Extension 
    HANDLE   hFile;     // Handle to file 
    WIN32_FIND_DATA FileInformation;   // File information 


strPattern = refcstrRootDirectory + "\\*.*"; 

    hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation); 
    if(hFile != INVALID_HANDLE_VALUE) 
    { 
    do 
    { 
     if(FileInformation.cFileName[0] != '.') 
     { 
     strFilePath.erase(); 
    strFilePath = refcstrRootDirectory + "\\" + FileInformation.cFileName; 

    if(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 
    { 
     if(bSearchSubdirectories) 
     { 
     // Search subdirectory 
     int iRC = SearchDirectory(refvecFiles, 
            strFilePath, 
            refcstrExtension, 
            bSearchSubdirectories); 
     if(iRC) 
      return iRC; 
     } 
    } 
    else 
    { 
     // Check extension 
     strExtension = FileInformation.cFileName; 
     strExtension = strExtension.substr(strExtension.rfind(".") + 1); 

     if(strExtension == refcstrExtension) 
     { 
     // Save filename 
     refvecFiles.push_back(strFilePath); 
     } 
    } 
    } 
} while(::FindNextFile(hFile, &FileInformation) == TRUE); 

// Close handle 
::FindClose(hFile); 

DWORD dwError = ::GetLastError(); 
if(dwError != ERROR_NO_MORE_FILES) 
    return dwError; 
    } 

    return 0; 
} 


int main() 
{ 
     int      iRC   = 0; 
    std::vector<std::string> vecAviFiles; 
    std::vector<std::string> vecTxtFiles; 


    // Search 'c:' for '.avi' files including subdirectories 
    iRC = SearchDirectory(vecAviFiles, "c:", "apk"); 
    if(iRC) 
{ 
    std::cout << "Error " << iRC << std::endl; 
    return -1; 
    } 

    // Print results 
    for(std::vector<std::string>::iterator iterAvi = vecAviFiles.begin(); 
    iterAvi != vecAviFiles.end(); 
    ++iterAvi) 
std::cout << *iterAvi << std::endl; 

    // Search 'c:\textfiles' for '.txt' files excluding subdirectories 
    iRC = SearchDirectory(vecTxtFiles, "c:", "txt", false); 
    if(iRC) 
{ 
    std::cout << "Error " << iRC << std::endl; 
    return -1; 
} 

// Print results 
    for(std::vector<std::string>::iterator iterTxt = vecTxtFiles.begin(); 
    iterTxt != vecTxtFiles.end(); 
    ++iterTxt) 
    std::cout << *iterTxt << std::endl; 

    // Wait for keystroke 
_getch(); 

return 0; 
} 
+1

В чем вопрос? –

+0

как итератировать все диски для поиска файлов .. в настоящее время моя программа ищет в C: \ диске только так, как я поставил это как аргумент в методе SeacrchDirectory() – user2660085

ответ

1

Я не программист Windows, но это выглядит например, вам нужно выяснить, какие диски доступны в вашей системе, и назвать свою функцию для всех. См. Здесь, как получить список доступных дисков в Windows: Enumerating all available drive letters in Windows

+1

. Ваш ответ - это просто ссылка на вопрос, который запрашивает то же самое, что и вот этот. Почему вы не проголосовали за закрытие в качестве обмана и вместо этого решили написать ответ, который не дает никаких подробностей и является ссылкой только для ответа? –

+0

It's * почти * такой же. Вызов функции несколько раз для каждого диска может показаться очевидным для меня и вас, но, возможно, не для человека, который задал вопрос. – piokuc

+0

как один из пользователей ответить на мой вопрос, что я должен использовать метод GetLogicalDrives, который возвращает все буквы диска в буфере, поэтому я использовал char buff [10] = GetLogicalDrives(); в моей программе, но компилятор дает мне ошибку «неправильного инициализатора» что я могу сделать сейчас? – user2660085

Смежные вопросы