2012-02-06 20 views
3

我正在用wxWidgets製作一個包含列表框的應用程序。我想獲取應用程序的當前工作目錄,並在該列表框中列出包含特定文件的cwd中的所有文件夾名稱(不是完整路徑)。使用wxWidgets製作目錄中的文件夾列表

我已經想出瞭如何獲取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; 
} 

回答

3

你可以使用wxDirTraverser - 你實現一個子類,並覆蓋一些方法,這將取決於如果該項目是一個文件或目錄被調用。

你也可以使用wxDir::GetAllFiles,它會返回一個wxArray(它可能更容易適應你,將它顯示在列表中)。

+0

謝謝!我可能使用GetAllFiles。希望我能弄清楚如何使用它。 – user1193108 2012-02-07 00:11:24

2

在列表中列出所有的文件夾名稱,

#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

好吧,我想把列表放在我已經創建的列表框中。我使用了@RyanWilcox的例子,但我遇到了麻煩。我收到了一些例外,我不知道如何處理它。運行時會發生異常: 'wxArrayString MainWindow :: createFolderList() { \t wxDir dir = wxGetCwd(); \t dirAddress = dir.GetName(); \t dir。GetAllFiles(dirAddress,dirList,wxEmptyString,wxDIR_DIRS | wxDIR_FILES); \t return * dirList; }' – user1193108 2012-02-07 18:28:48

+0

@ user1193108:我編輯了我的答案,以解決第二個問題。看一看。 – 2012-02-08 06:36:40

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

遞歸我使用導線子類: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; 
}; 
相關問題