我知道thread有一个类似的问题,但它并没有像它应该的那样工作。我对c ++和wxWidgets相当陌生,所以请尽可能简单。
void dlgMain::getAllDirectories(wxString Path)
{
wxDir dir(Path);
wxString dirName = dir.GetName();
wxArrayString dirList;
dir.GetAllFiles(dirName, &dirList, wxEmptyString, wxDIR_DIRS | wxDIR_FILES);
m_lbDir->Clear();
for (int i = 0; i < dirList.size(); i++)
{
//wxMessageBox(dirList[i].c_str());
m_lbDir->Append(dirList[i].c_str());
}
}
路径包含目录的路径(即&#34; C:\ Folder1 \&#34;)。我想将 Folder1 中的所有文件夹(不是文件)列入我的列表框。我的问题是它没有按照我想要的方式使用GetAllFiles()。它返回所有目录,子目录和文件,并以完整路径列出它们。我曾尝试使用 wxDIR_DIRS 作为过滤器,但不会返回任何内容?有什么想法吗?
答案 0 :(得分:2)
如果您只想获取目录,而不是子目录或文件,那么您可以创建一个派生自wxDirTraverser
的类来执行此操作,如下所示:
#include <wx/dir.h>
class wxDirectoriesEnumerator : public wxDirTraverser {
public:
wxArrayString *dirs;
wxDirectoriesEnumerator(wxArrayString* dirs_) {
dirs=dirs_;
}
//This function will be called when a file is found
virtual wxDirTraverseResult OnFile(const wxString& filename) {
//Do nothing, continue with the next file or directory
return wxDIR_CONTINUE;
}
//This function will be called when a directory is found
virtual wxDirTraverseResult OnDir(const wxString& dirname) {
//Add the directory to the results
dirs->Add(dirname);
//Do NOT enter this directory
return wxDIR_IGNORE;
}
};
然后您可以按如下方式使用它:
wxArrayString dirList;
wxDirectoriesEnumerator traverser(&dirList);
wxDir dir("C:\\Folder1");
if (dir.IsOpened()) {
dir.Traverse(traverser);
ListBox1->Clear();
for(unsigned int i=0; i<dirList.GetCount(); i++) {
//The name is what follows the last \ or /
ListBox1->Append(dirList.Item(i).AfterLast('\\').AfterLast('/'));
}
}
我认为您希望将ListBox1
替换为m_lbDir
,如果这是您的ListBox的名称。