ファイル検索について

このQ&Aのポイント
  • VC++.NETの開発環境で、拡張子無しファイルの検索を行うためにCFileFindクラスのFindFile関数を使用していますが、GetFileName()でファイル名を取得する際に問題が発生しています。
  • FindFile関数に適切なパラメータを渡すことで、ファイルの検索が実行されますが、GetFileName()を使用しても取得できるのは「.」というファイル名のみです。
  • この問題を解決できる方、ヒント、回答をお知りの方がいらっしゃいましたら、ご協力をお願い致します。
回答を見る
  • ベストアンサー

ファイル検索について

できれば、すぐに回答を頂けたら幸いです。 開発環境はVC++.NETです。 現在、CFileFindクラスのFindFile関数を使用して拡張子無しファイル検索をしようとしています。 FindFile関数に以下のようなパラメータを渡しています。 CFileFind finder; CString path = "C:\\*" BOOL Working = finder.FindFile(path,0); 上記のFindFileを実行後、GetFileName()でファイル名を取得しようとしても、「.」というのしか取得できません。 どなたかこの問題を解決できる方、ヒント、回答を宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

"*."で検索してみてください。 私の環境は、MSVC++&MFCですが、実際にプログラムを組んで実行してみましたがうまくいきましたよ。 ドットファイルは if(find.IsDots())continue; などとすると、とばせますよ。

ryou0607
質問者

お礼

ありがとうございました。 解決する事ができました。 また、質問する事があるとおもいますが 宜しくお願い致します。

関連するQ&A

  • 拡張子なしファイル検索について

    WindowsXPでVC++.NETを使ってプログラミングをしています。 拡張子なしファイル検索について質問があります。 現在、下記のようなソースを記述してます。 CString testPath = "D:\\*."; BOOL Working = finder.FindFile(testPath,0); if(Working) { AfxMessageBox("見つかりました",MB_OK,0); } else { AfxMessageBox("見つかりません",MB_OK,0); } で、ファイルがないのに、見つかりましたのメッセージボックスがでてきてしまいます。 すみませんが、ヒントか回答をいただけたら幸いです。 宜しくお願い致します。

  • フォルダ検索

    VC++6.0のMFCでプログラムを組んでいます。 CFileFind find; CString Newstr=●●+_T("\\*.*"); if(find.FindFile(Newstr)) { int i=1; while(i) { if(●●==""){ return 0; } i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ continue; } CString filename=●●+"\\"+find.GetFileName(); } } とすると●●フォルダの中のファイル名がfilenameに取得されます。 しかしもしフォルダの中にフォルダがある場合その中身も取得したいのですがどうすればいいのかわかりません。フォルダの中にフォルダが無くなるまで調べつづける予定です。

  • FTPの再帰について

    ファイル及びディクレトリを削除する関数を作成しているのですが、 再帰した時に、FindFileでディレクトリが取得できなくなってしまいます。 エラー情報を取得すると、Error12110が出ていました。 12110 ERROR_FTP_TRANSFER_IN_PROGRESS The requested operation cannot be made on the FTP session handle because an operation is already in progress. 以下、ソースもつけます。 ご指摘いただければうれしいです。 よろしくお願いします。 try { CFtpFileFind finder (m_ftpConP); BOOL bWorking = FALSE; CString strFilePath; if ((bWorking = finder.FindFile(pIstrFilePath + "/*")) != 0) { while( bWorking != 0 ) { bWorking = finder.FindNextFile(); if( finder.IsDots() != 0 ) continue; strFilePath = pIstrFilePath + "/"; strFilePath += finder.GetFileName(); if( finder.IsDirectory() != 0 ) { intRet = Remove( strFilePath ); } else { // ファイル if(m_ftpConP->Remove(strFilePath) == 0) { intRet = -1; } } } finder.Close(); if (!m_ftpConP->RemoveDirectory(pIstrFilePath)) { intRet = -1; } } } catch (CInternetException* pEx) { TCHAR sz[1024]; pEx->GetErrorMessage(sz, 1024); AfxMessageBox(sz); pEx->Delete(); }

  • Debug Assertion Failed

    前回フォルダの中のフォルダの中のファイル検索について質問させていただきましたが再帰を使えというアドバイスをいただきVC++6.0のMFCダイアログベースにて 【InitDialog内】 if(int p=0; p<=argc;p++){ test(__argv[p]); } void ●Dlg::test(CString strFolder) { CFileFind find; CString Newstr=strFolder+_T("\\*.*"); if(find.FindFile(Newstr)) { int i=1; while(i) { if(strFolder==""){ return 0; } i=find.FindNextFile(); if(find.IsDots()){ continue; } if(find.IsDirectory()){ test(find.GetFilePath()); } CString filename=strFolder+"\\"+find.GetFileName(); m_Ary.Add(filename); find.close(); } } } ※m_Aryは●Dlgクラスのメンバ変数 CStringArray m_Ary; これを実行すると Debug Assertion Failedが出てきて デバッグを押すと BOOL CFileFind::FildNextFile() { →ASSERT(m_hContext !=NULL) →の所でひっかかってるようです。 どうすれば直りますか?

  • 戻り値の取得が出来ません

    いつもお世話になっています。 ファイルを抽出するプログラムを作成しています。 関数の中で検索処理を行い、ファイルパスを返そうとしたのですが、returnの直前までは値が入っているのに、関数の呼び出し先で値が取れなくなってしまいました。 当方JAVA経験はあるものの、ポインタなどもまだ把握し切れていないC初心者なので、 不勉強で申し訳ないですが、ちょっと急ぎの用事のため、質問させて下さい。 **呼び出し元** char* SearchPastFile(CString strFolder,int imageFlag,char transTime[15]); void main( void ){ char* prevFile; // 転送元ファイル名 prevFile = SearchPastFile(cTransPath,iImageFlag,transTime); // 過去ファイルの取得【現状NULL】 MessageBox(NULL,prevFile,"パス",MB_OK);【←(確認用)空の状態】 } **関数** char* SearchPastFile(CString strFolder, int imageFlag, char transTime[15]){ CFileFind FileFind; // すべてのファイルを検索します CString strSearchFile = strFolder + _T("\\*.*"); if(!FileFind.FindFile(strSearchFile)) { Log("ファイルが見つかりませんでした。"); return NULL; } char *p; // ファイルパス BOOL bContinue = TRUE; while(bContinue){ (検索処理中略) // 24時間前のファイル if(imageFlag==1 && spanDays==-1){ Log("ファイルが見つかりました。"); MessageBox(NULL,p,"パス",MB_OK);【←(確認用)ここではパスが取れている】 return p; // 48時間前のファイル } else if(imageFlag==2 && spanDays==-2){ Log("ファイルが見つかりました。"); return p; } } }; return NULL; } prevFileに値を入れたいです。 他の回答を見て、p = (char*)malloc( 16 );などもやってみましたが、取れませんでした。 思い当たる節などがあれば、御教授よろしくお願いします。

  • フォルダ内検索

    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内のプログラムしか表示されません。どこがいけないのでしょうか?

  • Aドライブのエラーを回避したいのですが、

    何度もすみません。 コンボボックスにドライブ一覧を取得しました。 そのコンボボックスを選択すると、 リストボックス1に、フォルダのパス名が表示されます。 リストボックス2に、ファイル名が表示されます。 CドライブやDドライブはいいのですが、 Aドライブのリムーバルドライブを選択すると エラーが表示されます。 エラーが表示される前に何とかしたいと思うのですが、 どうすればいいのかわかりません。 または、エラーを無視するでもいいです。 よろしくお願いします。 以下が、ドライブを選択した時のコンボボックスの関数です。 VisualStudio.NET WindowsXP MFC です。 void CFileViewView::OnCbnCloseupCombo1() { CString listtxt; comb.GetWindowText(listtxt); for(int i=list1.GetCount()-1;i>-1;i--) { list1.DeleteString(i); } for(int i=list2.GetCount()-1;i>-1;i--) { list2.DeleteString(i); } CFileFind find; listtxt=listtxt+"\\*";//? 「A:\*」などを指定する find.FindFile(listtxt,0); bool work=true; CString findtxt; while(work) { AfxMessageBox("OK");//表示される。 work=find.FindNextFile(); //? A:\などを指定する AfxMessageBox("OK2"); //表示されない。 if(find.IsDirectory() && !find.IsSystem() && !find.IsHidden()) { list1.AddString(find.GetFilePath()); } if(find.IsArchived() && !find.IsSystem() && !find.IsHidden()) { list2.AddString(find.GetFileName()); } } }

  • ファイル操作について

    教えてください。 VC++で修正依頼を言い渡されたんですが、Cすら触ったことがないので大変困っています。 質問内容: EXEファイルに引数を指定すると、パラメータファイルから当該の情報を検索取得し、 内部処理のftpコマンドの引数として渡すというものです。 教えていただきたいのは、引数を元にパラメータファイルを検索し、当該情報を取得する部分です。 パラメータファイル例: 引数,接続先,ユーザID,パスワード,ファイル名 パラメータファイル作成条件: 1.複数行記述されています。 2.”引数”項目は常にユニークです。 3.区切り文字はカンマですが、タブになる可能性があります。 環境: Win2000 VC++(バージョンはまだわかりません。V6以降とは言っています。) 以上、よろしくお願い致します。

  • フルパスからファイル名取得の方法

    指定したフォルダのフルパスを「bmpFiles」に入れているのですが、表示する時はファイル名のみの表示にしたくて「Path.GetFileName」を使用してファイル名を取得しようとしたのですが、「型'stringの1次元配列'の値を'string'に変換できません」というエラーが出てしまいます。 VBを始めたばかりでよく分からないのでアドバイスをお願いします。 Dim imageDir As String = fbd.SelectedPath ' 指定フォルダまでのディレクトリ Dim bmpFiles As String() = _ System.IO.Directory.GetFiles(imageDir, "*.bmp") 'フルパス Dim bmpFileName As String = _ Path.GetFileName(bmpFiles)  ←bmpFilesで上記エラー

  • VBでのファイル検索(API以外で)

    誰か教えていただければうれしいです VBでファイル検索をしたいのですが まず利用可能なドライブを取得して ドライブごとに検索してファイルがあれば その絶対パスとファイルのあったドライブ名を グローバル変数に格納したいのですが API関数を使わない方法がわかりません わかるかたがいらっしゃれば教えていただけないでしょうか

専門家に質問してみよう