C++ 使用wxWidgets在目录中创建文件夹列表
我正在使用wxWidgets制作一个应用程序,其中包含一个列表框。我想获取应用程序的当前工作目录,并在该列表框中列出cwd中包含特定文件的所有文件夹名称(不是完整路径) 我已经知道如何获取cwd并将其作为wxString返回(我不是特别确定它是否正常工作,但我很快就会知道),但我不确定如何获取文件夹列表并将其传递到列表框 <>我对WxWIDGET是全新的,对C++和OOP比较新。如果你能找到一个好方法来解释如何做这件事,它将非常感谢 更新:继续使用GetAllFiles,但现在运行时出现异常。这是违规代码C++ 使用wxWidgets在目录中创建文件夹列表,c++,directory,wxwidgets,subdirectory,C++,Directory,Wxwidgets,Subdirectory,我正在使用wxWidgets制作一个应用程序,其中包含一个列表框。我想获取应用程序的当前工作目录,并在该列表框中列出cwd中包含特定文件的所有文件夹名称(不是完整路径) 我已经知道如何获取cwd并将其作为wxString返回(我不是特别确定它是否正常工作,但我很快就会知道),但我不确定如何获取文件夹列表并将其传递到列表框 我对WxWIDGET是全新的,对C++和OOP比较新。如果你能找到一个好方法来解释如何做这件事,它将非常感谢 更新:继续使用GetAllFiles,但现在运行时出现异常。这是违
wxArrayString MainWindow::createFolderList()
{
wxDir dir = wxGetCwd();
dirAddress = dir.GetName();
dir.GetAllFiles(dirAddress, dirList, wxEmptyString, wxDIR_DIRS | wxDIR_FILES);
return *dirList;
}
您可以使用-实现一个子类并重写一些方法,这些方法将根据项是文件还是目录而被调用
您还可以使用,它将返回一个wxArray(这对您来说可能更方便,将其显示在列表中)。用于列出列表中的所有文件夹名称
#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
(或者您发布了不完整的代码)
您的实现可能会有所不同,但我已将此代码与我自己的工作代码进行了改编。对于只获取子目录而不进行递归,wxDir类的文档中给出了正确答案: 对于递归,我使用遍历子类: 诀窍是只向列表中添加您需要的内容,这仅适用于目录:
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;
};
谢谢我可能正在使用GetAllFiles。希望我能想出如何使用它。我想把这个列表放到我已经制作好的列表框中。我使用了@RyanWilcox的例子,但我遇到了麻烦。我遇到了一些例外情况,我不知道如何处理。运行时会出现异常:
wxArrayString主窗口::createFolderList(){wxDir dir=wxGetCwd();dirAddress=dir.GetName();dir.GetAllFiles(dirAddress,dirList,wxEmptyString,wxDir|wxDir|u FILES);return*dirList;}/code>@user1193108:我已经编辑了关于第二个问题的答案。看一看。
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);
}
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;
};