2016-04-11 2 views
1

Ich muss eine Datei mit variabler Erweiterung mit Platzhalter (*.txt, *.jpeg, *.doc) auf einer Festplatte (c:) finden.Datei mit Platzhaltern auf der gesamten Festplatte finden

Ich habe versucht, mit der folgenden Funktion, aber ich kann es nicht rekursiv machen, und es funktioniert nicht:

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); 
    } 
} 

Natürlich habe ich es mit einem statischen Wert versucht (*.txt), um zu sehen, ob es funktioniert, aber es hat nicht funktioniert, wenn ich es aus in Haupt genannt:

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

'file.cFileName ==" * .txt "': Hier ist '==' kein Platzhalter für Mustervergleich, es vergleicht zwei Zeiger auf Gleichheit (und sie sind nicht gleich). – molbdnilo

+0

ok danke, aber mein anderes Problem ist, dass ich nicht weiß, wie Namensverzeichnis für rekursive Forschung weitergegeben. –

+0

Wird "Directory:" gedruckt? Ich würde Klammern um den binären Operator setzen, da sie mit seltsamer Priorität auswerten (dh 'if ((file.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&') ... nicht sicher, ob das das Problem ist ... – urban

Antwort

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); 

     } 
    } 

i die Funktion in diesem Modus aufrufen:

Recurse ("C:", "C:");

+0

ich finde Lösung: http: //stackoverflow.com/questions/17266343/c-find-all-wav-files, aber ich habe nicht den Unterschied zu meinem Code Wo bin ich falsch gelaufen? –