2016-11-07 1 views
-1

Ich möchte alle Bilder (wie .jpeg, .bmp .gif) von "C: \" in ein neues/bestehendes Verzeichnis kopieren. Wie kann ich das schreiben? Etwas wie (* .jpg | .bmp | .gif) ???Win32 API Kopieren von Bildern aus einem Verzeichnis in ein neues/bestehendes Verzeichnis

Hier ist mein Code:

HANDLE hFile; 
WIN32_FIND_DATA FindFileData; 
char *strTheNameOfTheFile=new char[MAX_PATH]; 
char folder[100]="D:\\myPictures\\"; 
char tempFolder[100]="D:\\myPictures\\"; 

SetCurrentDirectory("D:\\"); 
     hFile=FindFirstFile("*.jpg",&FindFileData);// Here is my problem | *.jpeg | *.bmp | *.gif 
     strTheNameOfTheFile = FindFileData.cFileName; 
     strcat(folder,strTheNameOfTheFile); 
     CopyFileEx(strTheNameOfTheFile,folder,NULL,NULL,NULL,NULL); 
     MessageBox(hDlg,strTheNameOfTheFile,"Oh",MB_OK); 
     strTheNameOfTheFile=NULL; 
     folder[0]='\0'; 
     strcpy(folder,tempFolder); 
     while(FindNextFile(hFile,&FindFileData)) 
     { 

      strTheNameOfTheFile = FindFileData.cFileName; 
      strcat(folder,strTheNameOfTheFile); 
      CopyFileEx(strTheNameOfTheFile,folder,NULL,NULL,NULL,NULL); 
      strTheNameOfTheFile=NULL; 
      folder[0]='\0'; 
      strcpy(folder,tempFolder); 
     } 
MessageBox(hDlg,"Done!","Finished",MB_OK); 

FindClose(hFile); 
+0

Reservieren Sie Speicher für 'strTheNameOfTheFile'? Versuchen Sie es als 'char [MAX_PATH] ' –

+0

Cool zu initialisieren. Das ist der Teil, um den es normalerweise fehlt. Nun zu dem Teil, der fehlt - die Frage. Was ist es? – enhzflep

+0

Fragen, die Debugging-Hilfe suchen ("** warum funktioniert dieser Code nicht? **") müssen das gewünschte Verhalten, ein spezifisches Problem oder einen Fehler und den kürzesten Code enthalten, um ** in der Frage selbst zu reproduzieren **. Fragen ohne ** eine klare Problemstellung ** sind für andere Leser nicht nützlich. Siehe: [Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels] (http://stackoverflow.com/help/mcve). –

Antwort

0

Option 1: Setzen Sie den Code in eine Funktion (beispielsweise CopyMyFiles), der die Erweiterung als Parameter übernimmt, und dann rufen Sie diese Funktion einmal für jede Erweiterung.

(Ihr Code ist ein bisschen fehlerhaft, so dass Sie zuerst, dass bis beheben musst.)

void CopyMyFiles(const char *pattern, const char *from, const char *to) { 
    const auto wild = std::string(from) + pattern; 
    WIN32_FIND_DATAA find_data; 
    HANDLE hfind = ::FindFirstFileA(wild.c_str(), &find_data); 
    if (hfind != INVALID_HANDLE_VALUE) { 
    do { 
     const auto source = std::string(from) + find_data.cFileName; 
     const auto target = std::string(to) + find_data.cFileName; 
     ::CopyFileExA(source.c_str(), target.c_str(), 
     nullptr, nullptr, nullptr, 0); 
    } while (::FindNextFileA(hfind, &find_data)); 
    ::FindClose(hfind); 
    } 
} 

Dann Sie dies einmal für jedes Muster aufrufen können (Erweiterung).

const char *patterns[] = {"*.jpg", "*.gif", "*.bmp" }; 
const char *from = "D:\\"; 
const char *to = "D:\\pictures\\"; 
for (const auto &pattern : patterns) 
    CopyMyFiles(pattern, from, to); 

Option 2: Aufzählen alle Dateien (mit diesem Muster "*") und kopieren Sie nur diejenigen, die eine Ihrer Erweiterungen entsprechen.

+0

Danke Adrian! für (const Auto & Muster: Muster) funktionieren wie eine foreach richtig? –

+0

Ja, das ist ein for-each in C++ 11 Syntax. Wenn Sie einen älteren Compiler verwenden, müssen Sie eine ausführlichere Schleifenanweisung schreiben. –

Verwandte Themen