使用wxWidgets在目录中创建文件夹列表

时间:2012-02-06 19:30:00

标签: c++ directory wxwidgets subdirectory

我正在使用包含列表框的wxWidgets创建应用程序。我想获取应用程序的当前工作目录,并在该列表框中列出包含特定文件的cwd中的所有文件夹名称(不是完整路径)。

我已经想出如何获得cwd并将其作为wxString返回(不是我特别确定它正在工作,但我很快就会发现)但是我不知道如何获得文件夹列表并将其传递给列表框。

我是wxWidgets的新手,对C ++和OOP来说相对较新。如果你能找到一个很好的方式向我解释如何做到这一点,我将不胜感激。

更新:使用GetAllFiles,但现在我运行时遇到异常。这是违规代码。

wxArrayString MainWindow::createFolderList()
{
    wxDir dir = wxGetCwd();

    dirAddress = dir.GetName();

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

    return *dirList;
}

3 个答案:

答案 0 :(得分:2)

您可以使用wxDirTraverser - 实现子类并覆盖一些方法,这些方法将根据项目是文件还是目录进行调用。

您还可以使用wxDir::GetAllFiles,它将返回一个wxArray(可能更方便您,将其显示在列表中)。

答案 1 :(得分:1)

列出列表中的所有文件夹名称,

#include "wx/dirdlg.h"

wxDirDialog dialog(parent, wxT("Testing directory picker"), cwd, wxDD_NEW_DIR_BUTTON);
if (dialog.ShowModal() == wxID_OK)
{
     wxString path = dialog.GetPath();
     wxMessageBox(path);
}

注意:您可以以任何方式使用path,此处只显示在消息框中。

但是,当然如果您想在自定义对话框中向用户显示文件夹名称,可以使用 RyanWilcox 解决方案。

编辑:在您的代码中,您尚未创建dirList(或者您发布了不完整的代码)

wxArrayString MainWindow::createFolderList()
{
    wxDir dir(wxGetCwd());
    if ( !dir.IsOpened() )
         ;//handle this error here

    wxString dirName = dir.GetName();
    wxArrayString dirList;

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

    //Note that next statement is optional
    dirList.shrink();

    return dirList;
}

您的实现可能会有所不同,但我已根据自己的工作代码调整了此代码。

答案 2 :(得分:0)

为了只获取没有递归的子目录,答案就在wxDir类的文档中: http://docs.wxwidgets.org/trunk/classwx_dir.html

wxDir dir("C:/myDir");
if(!dir.IsOpened())
{
  // deal with the error here, wxDir would already 
  // log an error message explaining the exact reason of the failure.
  return;
}
wxString filename;
bool cont = dir.GetFirst(&filename, wxEmptyString, wxDIR_DIRS);
while(cont)
{
  printf("%s\n", filename.c_str());
  cont = dir.GetNext(&filename);
}

对于递归,我使用Traverse子类:http://docs.wxwidgets.org/trunk/classwx_dir_traverser.html

技巧只是将所需内容添加到列表中,这仅适用于目录:

class wxDirTraverserSimple : public wxDirTraverser
{
  public:
    wxDirTraverserSimple(wxArrayString& files) : m_files(files){}
    virtual wxDirTraverseResult OnFile(const wxString& filename)
    {
      return wxDIR_CONTINUE;
    }
    virtual wxDirTraverseResult OnDir(const wxString& dirname)
    {
      m_files.Add(dirname);
      return wxDIR_CONTINUE;
    }
  private:
    wxArrayString& m_files;
};