C++ wxWidgets-将所有文件夹写入列表框

C++ wxWidgets-将所有文件夹写入列表框,c++,listbox,directory,wxwidgets,C++,Listbox,Directory,Wxwidgets,我知道有一个类似的问题,但它不工作的方式,它应该在那里。我对C++和WxWiDes相当新,请尽可能容易。< /P> void dlgMain::getAllDirectories(wxString Path) { wxDir dir(Path); wxString dirName = dir.GetName(); wxArrayString dirList; dir.GetAllFiles(dirName, &dirList, wxEmptyString, wxDIR_DIRS | w

我知道有一个类似的问题,但它不工作的方式,它应该在那里。我对C++和WxWiDes相当新,请尽可能容易。< /P>
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());
}
}
void dlgMain::getAllDirectories(wxString路径)
{
wxDir-dir(路径);
wxString dirName=dir.GetName();
WxArrastring目录;
dir.getall文件(dirName、&dirList、wxEmptyString、wxDIR|u DIRS | wxDIR|u文件);
m_lbDir->Clear();
对于(int i=0;iAppend(dirList[i].c_str());
}
}

Path包含目录的路径(即“C:\Folder1\”)。我想在我的列表框中列出Folder1中的所有文件夹(不是文件)。我的问题是它不能以我想要的方式处理GetAllFiles()。它返回所有目录、子目录和文件,并列出它们的完整路径。我试过只使用wxDIR_DIRS作为过滤器,但不会返回任何结果?有什么想法吗?

如果您只想获取目录,而不想获取子目录或文件,那么您可以创建一个派生自
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('/'));
    }
}
#包括
类wxDirectoriesEnumerator:公共wxDirTraverser{
公众:
wxArrayString*dirs;
wxDirectoriesEnumerator(wxArrayString*dirs_){
dirs=dirs;
}
//找到文件时将调用此函数
虚拟wxDirTraverseResult OnFile(常量wxString和文件名){
//不执行任何操作,继续下一个文件或目录
返回wxDIR_CONTINUE;
}
//找到目录时将调用此函数
虚拟wxDirTraverseResult OnDir(常量wxString和dirname){
//将目录添加到结果中
目录->添加(目录名称);
//不要进入这个目录
返回wxDIR_IGNORE;
}
};
然后,您可以按如下方式使用它:

#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('/'));
    }
}
wxArrayString目录列表;
wxDirectoriesEnumerator遍历器(&dirList);
wxDir目录(“C:\\Folder1”);
if(dir.IsOpened()){
直接遍历(遍历器);
ListBox1->Clear();
for(unsigned int i=0;iAppend(dirList.Item(i).AfterLast('\\').AfterLast('/'));
}
}
如果列表框的名称是
m_lbDir
,我想您应该将
ListBox1
替换为
m_lbDir