2012-02-23 74 views
0

我試圖在編譯成功後編譯這個程序,它在控制檯窗口上打印程序的當前目錄。 但該程序的工作是向我展示所有擴展名爲.doc的文件,當我不使用寬字符串wstring()時,它也能正常工作。所以這是我想用wstring函數編譯此程序的問題。用UNICODE名稱搜索文件

UPDATE:

此代碼正常工作:

#define UNICODE 
#include <string> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <windows.h> 
#include <conio.h> 

using namespace std; 
/* 
#define UNICODE 
#define _UNICODE 

typedef std::string UTF8String; 
*/ 
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; 
} 


// Prototype for conversion functions 
std::wstring StringToWString(const std::string& s); 
std::string WStringToString(const std::wstring& s); 

std::wstring StringToWString(const std::string& s) 
{ 
    std::wstring temp(s.length(),L' '); 
    std::copy(s.begin(), s.end(), temp.begin()); 
    return temp; 
} 


std::string WStringToString(const std::wstring& s) 
{ 
    std::string temp(s.length(), ' '); 
    std::copy(s.begin(), s.end(), temp.begin()); 
    return temp; 
} 

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:", "doc"); 
    if(iRC) 
    { 
    std::cout << "Error " << iRC << std::endl; 
    return -1; 
    } 


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

} 

不工作代碼:

#include <string> 
#include <vector> 
#include <iostream> 

#include <windows.h> 
#include <conio.h> 

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

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

    hFile = ::FindFirstFileW(strPattern.c_str(), &FileInformation); 
    if(hFile != INVALID_HANDLE_VALUE) 
    { 
    do 
    { 
     if(FileInformation.cFileName[0] != '.') 
     { 
     strFilePath.erase(); 
     strFilePath = refcstrRootDirectory + L"\\" + 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(L".") + 1); 

      if(strExtension == refcstrExtension) 
      { 
      // Save filename 
      refvecFiles.push_back(strFilePath); 
      } 
     } 
     } 
    } while(::FindNextFileW(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::wstring> vecAviFiles; 

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

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

什麼我想知道的是爲什麼第二個程序不起作用?

+0

那你的錯誤是什麼? – m0skit0 2012-02-23 13:30:13

+0

首先: X:\ C++ \ boost迭代器\ bin \ Debug \ 進程返回0(0x0)執行時間:12.165秒 按任意鍵繼續。 也是這個進程的當前目錄 其次: 我會將.doc改爲另一個擴展,而不是這個問題 問題是我無法獲得帶有.doc文件的路徑(或者轉換器) 延期。 – pourjour 2012-02-23 13:35:58

+0

你的代碼完全適合我。我唯一的建議是在這裏使用不區分大小寫的字符串比較:strExtension == refcstrExtension – 2012-02-23 13:42:47

回答

0

你在做錯了。

考慮strPattern = refcstrRootDirectory + L"\\*.*";。那*.*是有原因的。這是您指定要查找的文件模式的位置。如果您想尋找*.doc文件,這樣說:strPattern = refcstrRootDirectory + L"\\*." + refcstrExtension;

此外,一些風格筆記:

  • 刪除該類型的前綴。這是一種用於弱類型語言的慣例; C++是強類型的。
  • 定義的變量,你需要他們,而不是早先:
    • std::wstring Pattern = RootDirectory + L"\\*.*";
    • HFILE File = ::FindFirstFileW(Pattern.c_str(), &FileInformation);
  • 沒有必要刪除一個字符串,如果你分配一個新的值。例如。這工作正常。
    • FilePath = RootDirectory + L"\\" + FileInformation.cFileName;
  • 檢查一下這個是幹什麼的文件沒有擴展。
  • 你正在泄漏文件句柄if(iRC) return iRC;。 (C++對象會自動清理,但這是一個C API)。