Making a list of folders in a directory with wxWid

2019-02-19 07:19发布

问题:

I'm making an application with wxWidgets that has a listbox in it. I want to get the current working directory of the application, and in that listbox, list all the folders names (not full paths) in the cwd that contain a specific file.

I've already figured out how to get the cwd and return it as a wxString (not that I'm particularly sure it's working, but I'll find out soon enough) but I'm not sure how to get the list of folders and pass it to the listbox.

I'm brand new to wxWidgets, and relatively new to C++ and OOP. If you could find a good way to explain to me how to do this, it would be much appreciated.

Update: Went with using GetAllFiles, but now I get exceptions when I run it. Here is the offending code.

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

    dirAddress = dir.GetName();

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

    return *dirList;
}

回答1:

You could use wxDirTraverser - you implement a subclass and override some methods which will be called depending if the item is a file or directory.

You could also use wxDir::GetAllFiles, which will return a wxArray (which might be more convient for you, displaying it in a list).



回答2:

For listing all the folder names in a list,

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

Note : You can use path in any way you wish, here it just displays in a message box.

But of course if you want to display folder names in your custom dialog to your user, you can use RyanWilcox solution.

EDIT: In your code you have not created dirList (or you have posted incomplete code)

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

Your implementation might differ, but I have adapted this code, from my own working code.



回答3:

For getting only the subdirectories without recursion the answer is right in the documentation of the wxDir class: 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);
}

For recursion i use a Traverse sub-class: http://docs.wxwidgets.org/trunk/classwx_dir_traverser.html

The trick is only add to the list what you need, this is a case for directories only:

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