我正在使用包含列表框的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;
}
答案 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;
};