• 締切済み

MFC、フォルダの中のファイルパス

ダイアログベースにて、フォルダがドラッグアンドドロップされたら、フォルダの中のファイルのパスを一個ずつ取得したいのですが、どのようにしたらいいでしょうか。 void CDDDlg::OnDropFiles(HDROP hDropInfo) { char FileName[100]; int NameSize = sizeof(FileName); int FileNumber; CString str; int i; FileNumber = DragQueryFile(hDropInfo, 0xffffffff, FileName, NameSize); str.Format("ドロップされたファイルの数 =%d", FileNumber); AfxMessageBox(str); for(i=0; i<FileNumber; i++){ DragQueryFile(hDropInfo, i, FileName, NameSize); str.Format("第 %d 番目のファイル名 = %s", i, FileName); AfxMessageBox(str); } CDialog::OnDropFiles(hDropInfo); } のようにすると、フォルダのパスが出力されます。 例えば、testというフォルダの中にtest.txtがあり、testをドラッグアンドドロップしたら、test.txtのパスを取得したのですが・・・。 Visual Studio .NET2003を使用しており、まだ初心者ですがよろしくお願いします。

みんなの回答

  • jk39
  • ベストアンサー率54% (366/670)
回答No.1

MSDNの CFileFind::IsDirectory にある使用例が参考になります。 http://msdn2.microsoft.com/ja-jp/library/scx99850(VS.80).aspx 要は自分で再帰的に展開すればいいのです。 頑張ってみてくださいね。

cruach
質問者

お礼

ありがとうございます。FindFirstFileやFindNextFileを使うことによりできました。 とても参考になりました。本当にありがとうございました。

関連するQ&A

  • VC++でドラッグドロップ

    いつもお世話になっております。 今回はドラッグ&ドロップについてお聞きしたいです。 リストボックスにフォルダをドラッグしてそのフォルダの中身を リストに表示するというものを作りたく、ネットでいろいろ調べた所 以下のように作りました。 ResourceViewでドロップドラッグを許可にチェックを入れる case WM_CREATE:   DragAcceptFiles(::GetDlgItem(hWnd, IDC_LIST1), TRUE);   return TRUE; case WM_DROPFILES:   { // ドロップされた内容を取得   hdrop = (HDROP)wParam;   DWORD dwSize;   CHAR szPath[MAX_PATH+1];   ZeroMemory(szPath, sizeof(szPath));   int num = ::DragQueryFile(hdrop, -1, NULL, 0);   for (int i = 0; i < num; i++);{     dwSize = ::DragQueryFile(hdrop , i, szPath, MAX_PATH+1);     if (dwSize <= 0) //取得失敗     {       return FALSE;     }     else{ //以下にszPathから中身を表示させる処理 ・・・} 以上のようにするとドラッグしたファイルの数は 正しく取得しているのですがファイル名を得る関数部分で 1.i=0としているのに、最初からi=numの数になってしまう 2.二つ目のDragQueryFileのiを1にしても戻値(ファイル名のサイズ)は 0となって取得していない となってしまいます。 なぜこのようになってしまうのか、ご教授願います。 環境はVisual C++6.0 OSは windowsXP SP2です

  • フォルダ内検索

    VC++6.0のMFCで開発しています。 フォルダをどろっぷしてフォルダ内のファイルを取り出すという プログラムです。 メインダイアログのクラス for(int p=0;p<__argc-1;i++) { CFileFind find; CString vv; vv=__argv[p]; CString Newstr=vv+_T("\\*.*"); if(find.FindFile(Newstr)){ int i=1; while(i){ if(__argv[p]==""){ return 0; } i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ FolderDrop(find.GetFilePath()); } CString filename=vv+"\\"+find.GetFileName(); CString kakucho=GetKaku(filename); while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){ indexstr=m_listC.GetItemText(index3,0); if(kakucho==indexstr){ kdlg.m_DirectoryFileNameArray.Add(filename); } } m_FilenameArray.Add(filename); m_FolderFileNumber++; } find.Close(); } } void CDragDrop6Dlg::FolderDrop(CString str) { CString kakucho; int i=m_listC.GetItemCount(); CString indexstr; CString filename2; CKakuninDlg kdlg; int p; int index3=-1; for(p=0;p<=c;p++){//ドロップしたファイルがディレクトリの場合 CFileFind find; CString Newstr=str+_T("\\*.*"); if(find.FindFile(Newstr)){ int i=1; while(i){  i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ FolderDrop(find.GetFilePath()); } filename2=str+"\\"+find.GetFileName(); kakucho=GetKaku(filename2)//ファイルの拡張子を取り出す while((index3=m_listC.GetNextItem(index3,LVNI_ALL))!=-1){ indexstr=m_listC.GetItemText(index3,0); if(kakucho==indexstr){ kdlg.m_DirectoryFileNameArray.Add(filename2); } } m_FilenameArray.Add(filename2); m_FolderFileNumber++; } find.Close(); } } としてフォルダAの中にフォルダBが入っていてその中に入っているファイルCを取り出したいのです。 このプログラムではドロップしたファイルが 一番目のプログラムでフォルダA内の中身がファイルならfilenameに フォルダならBに潜り込む所まではいけました。 しかし実際に別ダイアログに取り出した全てのファイルの一覧を出すと A内のプログラムしか表示されません。どこがいけないのでしょうか?

  • アイコンにドラッグアンドドロップ

    VisualStudio 2005 で c++でダイアログベースのアプリケーションを作成しています。 ファイルをアイコンにドラッグアンドドロップして開くということをやりたいのですが、ファイルを開いたときにエラーが発生してしまいうまくいきません。対処方法を教えてください。 ソースファイル ::OnInitDialog(){ : : : : // TODO: 初期化をここに追加します。 DragAcceptFiles(); char *p = AfxGetApp()->m_lpCmdLine; CFile fin; if(p[0]!=NULL){ AfxMessageBox(p); fin.Open(FileName, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate); } AfxMessageBox(p)でドロップしたファイルのパスは表示できています。

  • EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテ

    EXCEL2007のVBAを使って、テキストファイルを読み込んで別のテキストファイルを作って書き込むというコードを書きましたが、新しく出来たテキストファイルの末尾に、もともとのファイルには無かったスペースが追加されてしまいます。 原因と対策を教えて頂きたいです。 ------------------------------------------------------- Dim FileName1 As String Dim FileName2 As String Dim FileNumber1 As Integer Dim FileNumber2 As Integer Dim Data As String FileName1 = Application.GetOpenFilename("Text Files (*.txt), *.txt") FileName2 = Application.GetSaveAsFilename(, "Text Files (*.txt), *.txt") Data = Space(FileLen(FileName1)) FileNumber1 = FreeFile Open FileName1 For Binary As #FileNumber1 Get #FileNumber1, , Data Close #FileNumber1 'この間に"Data"内容を処理するコードを入れる予定 FileNumber2 = FreeFile Open FileName2 For Binary As #FileNumber2 Put #FileNumber2, , Data Close #FileNumber2 ------------------------------------------------------- このコードで1284バイトのテキストを読み込ませると末尾にスペースが追加されて1918バイトになってしまいました。 "Data"の内容を表示させてもスペースはなく、Len関数で大きさを調べても1284バイトです。

  • 指定フォルダ配下のファイルを個別圧縮するバッチファイルの作成

    下記の処理を行うバッチファイルは作れないでしょうか? 1.バッチファイルにフォルダをドラッグ&ドロップ 2.ドラッグ&ドロップしたフォルダ配下のファイルを全て個別圧縮する (例.C:\AAAをドラッグ&ドロップした場合) フォルダAAA | ・111.txt | LフォルダBBB | ・222.txt | ・333.txt | LフォルダCCC | ・444.txt | LフォルダDDD ・555.txt ↓ フォルダAAA | ・111.zip | LフォルダBBB | ・222.zip | ・333.zip | LフォルダCCC | ・444.zip | LフォルダDDD ・555.zip

  • Access ファイルかフォルダの判定

    お世話になります。 Access2010 フォーム上にActiveXのProgressBarコントロールを設置し、 そこにドラッグ&ドロップされた画像を、フォーム上のイメージ コントロールに表示するようにしました。 また、複数ファイルをドラッグ&ドロップされた場合は、エラーメッセージ を表示するようにしてます。 ここまでは問題ありません。 ただ、フォルダごとドラッグ&ドロップされた際にも、エラーメッセージを 表示させたいのですが、やり方がわかりません。 ドロップ&ドロップされたファイル、もしくはフォルダのパスは取得して いるので、そのパスからフォルダか否か判定することは可能でしょうか。 ご教示の程、宜しくお願い致します。

  • フォルダ内のファイル名の末尾7文字を一括置換

    フォルダ内のファイル名の末尾7文字を一括置換 こんにちは、VBA初心者です。 D:\test フォルダに test_jp.txt、sample_jp.txt、testsample_jp.txt といった名前のファイルが格納されているとします。 これらのファイル名の「_jp.txt」の部分(末尾7文字の部分)を「_en.txt」に置換したいのですが、うまくいきません。 以下のようなプログラムを書いてみたのですが、どこがいけないのでしょうか。 ※「実行時エラー53 ファイル名が見つかりません。」となります。 ※ VBEのローカルペインによると、エラー時には filename 変数に sample_jp.txt が格納されています。 Sub ファイル名置換() Dim fileName As String fileName = Dir("D:\test\*_ja.txt") Do Until fileName = "" Name "D:\test" & fileName As "D:\test" & Left(fileName, Len(filename) - 7) & "_de.txt" filename = Dir() Loop End Sub

  • フォルダ名をファイル名の先頭に追加できるバッチ

    例えばDドライブ直下にAからZまでの26個のフォルダがあり、例えばフォルダAの中に01から99までの連番で01.txt~99.txtと言うものがあったときに、バッチファイルのアイコンにフォルダAをドラッグアンドドロップするとフォルダ内のファイルがA01.txt~A99.txtと言うファイルが生成される、なお、フォルダはAからZまでまとめてバッチファイルのアイコンにドラッグアンドドロップしたらファイル名をリネームできるものを希望します、そのようなバッチはどのように作ったらよいのでしょうか。 当方の環境はwindows7 HomePremiam 64bitです。

  • ドラッグアンドドロップでHTMLファイル上の画像ファイルのパスを取得

    IEなどのブラウザに表示されたHTMLファイル上の画像ファイル(jpeg or gif)を ドラッグアンドドロップして、画像ファイルのWeb上のパスを得たいと考えています。 現在、以下コードで試していますが、PCに保存されたローカルパス+ファイル名が 帰ってきます。なんとかして画像ファイルのWeb上のパスを取得できないでしょうか。 【例】http://www.abc.co.jp/aaa.jpgなど こちらの環境はWindowsXP HomeEdition + C++ builder6 proです。 //Dropの設定 DragAcceptFiles(Handle,true); //--------------------------------------------------------------------------- void __fastcall TForm2::DropFiles(TWMDropFiles inMsg) { char fName[255]; int Count = DragQueryFile((HDROP)inMsg.Drop,0xffffffffF, fName, 255); //Dropされたファイル名を得る for(int i=0;i<Count;i++){ DragQueryFile((HDROP)inMsg.Drop,i,fName,255); ListBox1->Items->Add(fName); } DragFinish((HDROP)inMsg.Drop); } 宜しくお願いいたします。

  • 文字列の引数を元に名前を変えて返す関数

    基本名と拡張子名と番号を引数として、連番ファイル名の文字列を返す関数を作っています。 例えばfor文で10回ループさせる場合、Name1に"画像"、Name2に".jpg"、Numにiを渡せば、文字列"画像00.jpg"~"画像10.jpg"が返ってくるという仕組みです。しかし、試行錯誤してもポインタの仕組みが根本的に理解できてないようなので、下に示すコードの修正と解説をお願いしてもよろしいでしょうか。ちなみにこのコードではstrcatの部分でエラーが起きます。 char FileRename(char *Name1,char *Name2,int Num) { char *FileNumber[100]; FileNumber[0] = "00"; FileNumber[1] = "01"; FileNumber[2] = "02"; FileNumber[3] = "03"; FileNumber[4] = "04"; FileNumber[5] = "05"; FileNumber[6] = "06"; FileNumber[7] = "07"; FileNumber[8] = "08"; FileNumber[9] = "09"; FileNumber[10] = "10"; FileNumber[11] = "11"; FileNumber[12] = "12"; FileNumber[13] = "13"; FileNumber[14] = "14"; FileNumber[15] = "15"; char *str; str = Name1; char *add = FileNumber[Num]; strncat(str,add,2); add[30] = *Name2; strncat(str,add,strlen(Name2)); return *str; }