• ベストアンサー

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) →の所でひっかかってるようです。 どうすれば直りますか?

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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(); } といった具合です

zaqwe
質問者

お礼

ありがとうございました

関連するQ&A