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

wxWidgets - Write all folders into a listbox

本文关键字:列表 文件夹 wxWidgets      更新时间:2023-10-16

我知道有一个线程有类似的问题,但它没有按照应有的方式工作。我对 c++ 和 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\")。我想在我的列表框中列出文件夹1中的所有文件夹(不是文件)。我的问题是它不能按照我想要的方式与 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('/'));
    }
}

我想你会想用m_lbDir替换ListBox1,如果这是你的列表框的名称。