2012-02-06 4 views
3

wxWidgets에 목록 상자가있는 응용 프로그램을 만들고 있습니다. 응용 프로그램의 현재 작업 디렉토리를 가져오고 해당 목록 상자에 특정 파일이 들어있는 cwd의 모든 폴더 이름 (전체 경로가 아님)을 나열합니다.wxWidgets을 사용하여 디렉토리의 폴더 목록 만들기

나는 cwd를 가져와 wxString으로 반환하는 방법을 이미 알아 냈습니다. (특히 작동하는지는 확실하지 않지만 곧 알게 될 것입니다.) 그러나 어떻게 얻을 수 있는지 잘 모르겠습니다. 폴더 목록 및 목록 상자에 전달하십시오.

저는 wxWidgets에 새롭고 비교적 C++ 및 OOP에 새로운 기능을 제공합니다. 이 일을하는 방법을 나에게 설명 할 좋은 방법을 찾으면 많은 도움이 될 것입니다.

업데이트 : GetAllFiles를 사용하여 갔으나 이제 실행할 때 예외가 발생합니다. 여기에 문제가되는 코드가 있습니다. 서브 클래스를 구현하고 항목이 파일이나 디렉토리 인 경우 따라 호출되는 일부 메소드를 오버라이드 (override) -

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가 반환됩니다 (더 convient 한 것일 수도 있음).

목록에있는 모든 폴더 이름을 나열 들어
+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 솔루션을 사용할 수 있습니다.

편집 : 코드에서 당신은 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; 
} 

귀하의 구현이 다를 수 있습니다,하지만 난 내 자신의 작업 코드에서이 코드를 적용했다. http://docs.wxwidgets.org/trunk/classwx_dir_traverser.html

트릭은 다음과 같습니다 재귀를 들어 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); 
} 

내가 트래버스 하위 클래스를 사용 : 재귀없이 단지 하위 디렉토리를 얻기 위해

+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 : 두 번째 문제점에 대한 답을 편집했습니다. 봐. –

0

는 대답은 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; 
};