Составление списка папок в каталоге с помощью wxWidgets - PullRequest
2 голосов
/ 06 февраля 2012

Я делаю приложение с wxWidgets, в котором есть список. Я хочу получить текущий рабочий каталог приложения и в этом списке перечислить все имена папок (не полные пути) в cwd, которые содержат определенный файл.

Я уже выяснил, как получить cwd и вернуть его как wxString (не то, чтобы я особенно уверен, что он работает, но я скоро выясню), но я не уверен, как получить список папок и передать его в список.

Я новичок в wxWidgets и относительно нов в C ++ и ООП. Если бы вы могли найти хороший способ объяснить мне, как это сделать, это было бы очень ценно.

Обновление: пошло с использованием GetAllFiles, но теперь я получаю исключения, когда запускаю его. Вот код оскорбления.

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

    dirAddress = dir.GetName();

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

    return *dirList;
}

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Вы можете использовать wxDirTraverser - вы реализуете подкласс и переопределяете некоторые методы, которые будут вызываться в зависимости от того, является ли элемент файлом или каталогом.

Вы также можете использовать wxDir :: GetAllFiles , который будет возвращать wxArray (который может быть более удобным для вас, отображая его в списке).

1 голос
/ 07 февраля 2012

Для перечисления всех имен папок в списке,

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

Ваша реализация может отличаться, но я адаптировал этот код из моего собственного рабочего кода.

0 голосов
/ 15 апреля 2015

Для получения только подкаталогов без рекурсии ответ правильный в документации класса 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;
};
...