2013-12-18 2 views
1

Я знаю, что есть thread с похожим вопросом, но он не работает так, как он должен быть там. Я довольно новичок в C++ и wxWidgets, поэтому, пожалуйста, как можно проще.wxWidgets - Напишите все папки в список

void dlgMain::getAllDirectories(wxString Path) 
{ 
wxDir dir(Path); 
wxString dirName = dir.GetName(); 
wxArrayString dirList; 

dir.GetAllFiles(dirName, &dirList, wxEmptyString, wxDIR_DIRS | wxDIR_FILES); 

m_lbDir->Clear(); 

for (int i = 0; i < dirList.size(); i++) 
{ 
    //wxMessageBox(dirList[i].c_str()); 
    m_lbDir->Append(dirList[i].c_str()); 
} 
} 

Путь содержит путь к директории (т.е.. "C: \ Folder1 \"). Я хочу перечислить все папки (не файлы) в пределах Folder1 в мой список. Моя проблема в том, что она не работает с GetAllFiles() так, как я хочу. Он возвращает все каталоги, подкаталоги и файлы и перечисляет их с полным путем. Я пробовал использовать только wxDIR_DIRS как фильтр, но это ничего не вернет? Есть идеи?

ответ

2

Если вы хотите, чтобы получить каталоги, а не суб-каталогов или файлов, то вы можете создать класс, производный от wxDirTraverser сделать это следующим образом:

#include <wx/dir.h> 
class wxDirectoriesEnumerator : public wxDirTraverser { 
public: 
    wxArrayString *dirs; 
    wxDirectoriesEnumerator(wxArrayString* dirs_) { 
     dirs=dirs_; 
    } 
    //This function will be called when a file is found 
    virtual wxDirTraverseResult OnFile(const wxString& filename) { 
     //Do nothing, continue with the next file or directory 
     return wxDIR_CONTINUE; 
    } 
    //This function will be called when a directory is found 
    virtual wxDirTraverseResult OnDir(const wxString& dirname) { 
     //Add the directory to the results 
     dirs->Add(dirname); 
     //Do NOT enter this directory 
     return wxDIR_IGNORE; 
    } 
}; 

Вы можете использовать его в качестве следующим образом:

wxArrayString dirList; 
wxDirectoriesEnumerator traverser(&dirList); 
wxDir dir("C:\\Folder1"); 
if (dir.IsOpened()) { 
    dir.Traverse(traverser); 
    ListBox1->Clear(); 
    for(unsigned int i=0; i<dirList.GetCount(); i++) { 
     //The name is what follows the last \ or/
     ListBox1->Append(dirList.Item(i).AfterLast('\\').AfterLast('/')); 
    } 
} 

Я думаю, что вы хотите заменить ListBox1 с m_lbDir, если это имя вашего ListBox.

Смежные вопросы