2013-08-07 19 views
1

我有一個程序,成功搜索特定驅動器中的特定擴展的文件(我正在使用Windows),讓我們說它是「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

*幾乎*相同。爲每個驅動器多次調用函數可能對我和你來說看起來很明顯,但對於提出問題的人可能不是這樣。 – piokuc

+0

作爲用戶之一回答我的問題,我應該使用GetLogicalDrives方法,它返回緩衝區中的所有驅動器號,所以我用 char buff [10] = GetLogicalDrives(); 在我的程序,但編譯器給我「無效初始值設定項」錯誤 我現在可以做什麼? – user2660085

相關問題