2012-02-06 7 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

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ソリューションを使用できます。

EDIT:あなたのコードでは、あなたが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; 
} 

あなたの実装が異なる場合がありますが、私は自分の作業コードから、このコードを適応しています。答えは右wxDirクラスのドキュメントにある再帰なしサブディレクトリのみ取得するための

+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

+0

@ user1193108:私はあなたの2番目の問題のために私の答えを編集しました。見てみましょう。 –

0

:再帰を 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; 
}; 
関連する問題