dポイントプレゼントキャンペーン実施中!

前回フォルダの中のフォルダの中のファイル検索について質問させていただきましたが再帰を使えというアドバイスをいただき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)

→の所でひっかかってるようです。
どうすれば直りますか?

A 回答 (1件)

Find.Close()の位置が悪いからですよ



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がクローズされてしまう
    find.close();
  }
}
以下のようにしてみましょう

if ( find.FindFile( Newstr ) ) {
  while( find.FindNextFile() ) {
    if ( find.IsDots() )
      // . .. などは除外
      continue;
    }
    if ( find.IsDirectory() ) {
      // サブフォルダーを再帰呼び出し
      Test( Find.GetFilePath() );
    }
    CString filename = strFolder + "\\" + find.GetFileName();
    m_Ary.Add(filename);
    // whileへ戻ってフォルダー内を検索
  }
  // 処理するファイルが無くなったのでココでクローズする
  find.Close();
}

といった具合です
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2009/04/20 13:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!