2016-11-07 9 views
-1

"C:\"から新しい/既存のディレクトリにすべての画像ファイル(.jpeg、.bmp .gifなど)をコピーしたいとします。 どうすればいいですか?何か(* .jpg | .bmp | .gif)のようなもの???ここでWin32 APIディレクトリから新しい/既存のディレクトリに画像ファイルをコピーする

は私のコードです:

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

'strTheNameOfTheFile'にメモリを割り当てていますか? 'char [MAX_PATH]' –

+0

Coolとして初期化してみてください。それは、通常は行方不明の世話をする部分です。今_欠落している部分について - 質問。それは何ですか? – enhzflep

+0

デバッグヘルプ( "**なぜこのコードは動作しないのですか?**")には、目的の動作、特定の問題またはエラー、および質問自体**を再現するのに必要な最短コードが含まれている必要があります。 **明確な問題文**のない質問は他の読者には役に立たない。参照:[最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve) –

答えて

0

オプション1:機能(例えば、CopyMyFiles)にコードを入れて、パラメータとして拡張を取り、その後、あなたは拡張子ごとに一度、その関数を呼び出します。

(あなたのコードは、ビットバギーなので、あなたが最初にそれを修正する必要があります。)

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

その後、各パターン(拡張子)のために一度にこれを呼び出すことができます。

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

オプション2:(そのパターン"*"を使用して)すべてのファイルを列挙し、拡張機能のいずれかと一致するものだけをコピーします。

+0

ありがとうアドリアン! for(const auto&pattern:patterns)はforeachのように機能しますか? –

+0

はい、それはC++ 11の構文のfor-eachです。古いコンパイラを使用している場合は、より冗長なループ文を記述する必要があります。 –

関連する問題