【问题标题】:Making a list of folders in a directory with wxWidgets使用 wxWidgets 制作目录中的文件夹列表
【发布时间】:2012-02-28 06:38:09
【问题描述】:

我正在使用 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;
}

【问题讨论】:

    标签: c++ directory wxwidgets subdirectory


    【解决方案1】:

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

    你也可以使用wxDir::GetAllFiles,它会返回一个wxArray(这对你来说可能更方便,显示在一个列表中)。

    【讨论】:

    • 谢谢!我可能使用 GetAllFiles。希望我能弄清楚如何使用它。
    【解决方案2】:

    对于只获取子目录而不递归,答案在 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;
    };
    

    【讨论】:

      【解决方案3】:

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

      #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;
      }
      

      您的实现可能有所不同,但我已根据我自己的工作代码改编了这段代码。

      【讨论】:

      • 嗯,我想把列表放在我已经制作的列表框中。我使用了@RyanWilcox 示例,但我遇到了麻烦。我遇到了一些异常,我不确定如何处理它。运行时发生异常:wxArrayString MainWindow::createFolderList() { wxDir dir = wxGetCwd(); dirAddress = dir.GetName(); dir.GetAllFiles(dirAddress, dirList, wxEmptyString, wxDIR_DIRS | wxDIR_FILES); return *dirList; }
      • @user1193108:我已经为您的第二个问题编辑了答案。看看吧。
      猜你喜欢
      • 2021-09-22
      • 2012-04-12
      • 2010-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      相关资源
      最近更新 更多