2017-02-11 5 views
0

すべてのファイルとフォルダ(サブフォルダを含む)をリストボックスに表示して、それらを表示する再帰関数を作成すると思います。しかし、コードは、選択するフォルダ内のすべてのファイルとフォルダを表示するとうまく機能しますが、サブフォルダでスキャンすることはできません(最初のフォルダのみを表示します)。エラーとは何ですか?MFCエラーで再帰的にすべてのファイルを一覧表示しますか?

これは私の機能(私は私のダイアログクラスにそれを追加します)

void CFileListingDlg::ListFile(CString path) 
{ 
    CFileFind hFile; 
    BOOL bFound; 
    CString filePath; 
    bFound=hFile.FindFile(path+L"\\*.*"); 
    while(bFound) 
    { 
     bFound=hFile.FindNextFile(); 
     if(!hFile.IsDots()) 
     { 
      m_lFiles.AddString(hFile.GetFilePath()); 

      //It work well with selecting folder if I remove this line 
      //But it shows only first folder when I use it 
      if(hFile.IsDirectory()) ListFile(hFile.GetFilePath()+L"\\*.*"); 

     } 
    } 
} 

され、その後、ここでは、コード

void CFileListingDlg::OnBnClickedBtnBrowse() 
{ 
    // TODO: Add your control notification handler code here 
    // TODO: Add your control notification handler code here 
    CFolderPickerDialog folderDialog(_T("E:\\Test")); 
    if(folderDialog.DoModal()==IDOK) 
    { 
     m_eFolder.SetWindowText(folderDialog.GetPathName()); 
     m_lFiles.ResetContent(); 
     ListFile(folderDialog.GetPathName()); 
    } 
} 
+1

デバッガを使用することをお勧めします。 –

+4

関数呼び出しと関数本体の両方で '*。* 'を追加する必要はありません。 –

+0

ありがとう、ニールバターワース、私はあなたのコメントでそれを解決します。 – HuynhAT

答えて

0

とクリックブラウザボタンがに適切な方法であるとき、私はそれを呼び出します再帰的ファイルリストを実装する:

void ListFiles(const CString& sPath, CStringArray& files) 
{ 
    CFileFind finder; 

    // build a string with wildcards 
    CString sWildcard(sPath); 
    sWildcard += _T("\\*.*"); 

    BOOL bWorking = finder.FindFile(sWildcard); 

    while (bWorking) 
    { 
     bWorking = finder.FindNextFile(); 

     // skip . and .. files; otherwise, we'd 
     // recur infinitely! 

     if (finder.IsDots()) 
     continue; 

     // if it's a directory, recursively traverse it 

     if (finder.IsDirectory()) 
     { 
     CString sFile = finder.GetFilePath(); 
     files.Add(sFile); 
     ListFiles(sFile, files); 
     } 
    } 

    finder.Close(); 
} 
関連する問題