2016-04-11 12 views
1

ディスク(c:)にワイルドカード(*.txt*.jpeg*.doc)を使用して可変長ファイルを探す必要があります。ディスク全体にワイルドカードを含むファイルを見つける

私は、次の機能を試してみましたが、私はそれが再帰的に作ることができない、それは働いていない:

もちろん
void Recurse(LPCTSTR str) 
{ 
    WIN32_FIND_DATA file; 
    cout << "Value INPUT:" << str <<"\n"; 
    HANDLE search_handle=FindFirstFile(str,&file); 
    if (search_handle) { 
     do { 
     if(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && 
       strcmp(file.cFileName,"..")!=0 
       && strcmp(file.cFileName,".")!=0 
       && strcmp(file.cFileName,"$Recycle.Bin")!=0 
       && strcmp(file.cFileName,"Recovery")!=0 
       && strcmp(file.cFileName,"System Volume Information")!=0 
       && strcmp(file.cFileName,"PerfLogs")!=0 
       && strcmp(file.cFileName,"Windows")!=0) 
      { 
       str = file.cFileName; 
       cout << "Directory :" << file.cFileName <<"\n"; 
       Recurse(str); // Function to remind new directory 
      } else { 
       if (file.cFileName == "*.txt") { 
        std::wcout << file.cFileName << std::endl; //Print files find with estension txt 
       } 
      } 
     } while(FindNextFile(search_handle,&file)); 

     CloseHandle(search_handle); 
    } 
} 

私はそれが働いたかどうかを確認するために静的な値(*.txt)でそれを試してみました、私がメインでからそれを呼び出したときに、それはうまくいきませんでした:

Recurse("C:\\*"); 
+2

'file.cFileName ==" * .txt "':ここでは、 '=='はワイルドカードパターンマッチング演算子ではなく、2つのポインタが等しいかどうかを比較します。 – molbdnilo

+0

大丈夫ですが、私のもう一つの問題は、再帰的な研究のためにどのように名前ディレクトリを渡したのか分かりません。 –

+0

ディレクトリ ":"が印刷されていますか?私は奇妙な優先度(すなわち 'if((file.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)&&')で評価しているので、二項演算子の周りに括弧を入れます。それが問題なのかどうかわかりません。 – urban

答えて

0
I modified the code in this way. If it finds them throwing me * .txt files and me brings them correctly, but the path instead in many files shows me incorrect with several strange characters. I can not understand why such behavior. 

char *my1; 
    char *my2; 
    char *my3; 
    char *my4; 
    char *cp2; 
    LPCTSTR ori; 
    std::string stringa_mia; 
    std::vector<std::string> listafiles; 
    std::vector<std::string> listapath; 

    void Recurse(LPCTSTR str, LPCTSTR ori) 
    { 
     WIN32_FIND_DATA file; 
     cp2 = strdup(str); 
     strcat(cp2, "\\*"); 
     HANDLE search_handle=FindFirstFile(cp2,&file); 
     BOOL res = TRUE; 
     if (search_handle) 
     { 
      while(search_handle != INVALID_HANDLE_VALUE && res) 
      { 
      if(file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && 
         strcmp(file.cFileName,"..")!=0 
         && strcmp(file.cFileName,".")!=0 
         && strcmp(file.cFileName,"$Recycle.Bin")!=0 
         && strcmp(file.cFileName,"Recovery")!=0 
         && strcmp(file.cFileName,"System Volume Information")!=0 
         && strcmp(file.cFileName,"PerfLogs")!=0 
         && strcmp(file.cFileName,"Windows")!=0 
         && strcmp(file.cFileName,"Program Files")!=0 
         && strcmp(file.cFileName,"Boot")!=0 
         && strcmp(file.cFileName,"Program Files (x86)")!=0 
         && strcmp(file.cFileName,"AppData")!=0 
         && strcmp(file.cFileName,"ProgramData")!=0 
         && strcmp(file.cFileName,"Cookies")!=0 
         && strcmp(file.cFileName,".android")!=0 
         && strcmp(file.cFileName,"Programmi")!=0 
         ) 
        { 
         my3 = strdup(file.cFileName); 
         my2 = strdup(str); 
         my1 = strdup(ori); 
         strcat(my2, "\\"); 
         strcat(my2, my3); 
         CloseHandle(search_handle); 
         Recurse(my2,ori); 
         } 
      else 
      { 
       my4 = strdup(file.cFileName); 
       stringa_mia = std::string(my4); 
       if (stringa_mia.find(".txt")!=std::string::npos) { 
        listafiles.push_back(stringa_mia); 
        listapath.push_back(str); 
               } 
      } 
      res = FindNextFile(search_handle,&file); 
      } 
       CloseHandle(search_handle); 

     } 
    } 

私は、このモードでの関数を呼び出す:

再帰( "C:"、 "C:");

+0

解決策を見つける:http: //stackoverflow.com/questions/17266343/c-find-all-wav-filesしかし、私のコードとの違いはありません。どこが間違っていましたか? –

関連する問題