From d9ff0f91fbddae88286567cab74dcfb59c91fc0f Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 23 Jul 2001 13:28:39 +0000 Subject: [PATCH] added and documented wxDir::HasFiles/SubDirs(), use the latter in wxDirDialog - it is several orders of magniture faster than wxFindFirstFile! git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11161 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/dir.tex | 16 ++++++++++++++++ include/wx/dir.h | 11 +++++++++-- src/generic/dirdlgg.cpp | 34 ++++++++++++---------------------- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/docs/latex/wx/dir.tex b/docs/latex/wx/dir.tex index f54e104053..6a3dbe6a83 100644 --- a/docs/latex/wx/dir.tex +++ b/docs/latex/wx/dir.tex @@ -126,6 +126,22 @@ empty) and flags, return TRUE on success. Continue enumerating files satisfying the criteria specified by the last call to \helpref{GetFirst}{wxdirgetfirst}. +\membersection{wxDir::HasFiles}\label{wxdirhasfiles} + +\func{bool}{HasFiles}{\param{const wxString& }{filespec = wxEmptyString}} + +Returns {\tt TRUE} if the directory contains any files matching the given +{\it filespec}. If {\it filespec} is empty, look for any files at all. In any +case, even hidden files are taken into account. + +\membersection{wxDir::HasSubDirs}\label{wxdirhassubdirs} + +\func{bool}{HasSubDirs}{\param{const wxString& }{dirspec = wxEmptyString}} + +Returns {\tt TRUE} if the directory contains any subdirectories (if a non +empty {\it filespec} is given, only check for directories matching it). +The hidden subdirectories are taken into account as well. + \membersection{wxDir::Traverse}\label{wxdirtraverse} \func{size\_t}{Traverse}{\param{wxDirTraverser& }{sink}, \param{const wxString& }{filespec = wxEmptyString}, \param{int }{flags = wxDIR\_DEFAULT}} diff --git a/include/wx/dir.h b/include/wx/dir.h index de2563540b..4c8a2368cb 100644 --- a/include/wx/dir.h +++ b/include/wx/dir.h @@ -103,10 +103,17 @@ public: const wxString& filespec = wxEmptyString, int flags = wxDIR_DEFAULT) const; - // get next file in the enumeration started with either GetFirst() or - // GetFirstNormal() + // get next file in the enumeration started with GetFirst() bool GetNext(wxString *filename) const; + // return true if this directory has any files in it + bool HasFiles(const wxString& spec = wxEmptyString) + { wxString s; return GetFirst(&s, spec, wxDIR_FILES | wxDIR_HIDDEN); } + + // return true if this directory has any subdirectories + bool HasSubDirs(const wxString& spec = wxEmptyString) + { wxString s; return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN); } + // enumerate all files in this directory and its subdirectories // // return the number of files found diff --git a/src/generic/dirdlgg.cpp b/src/generic/dirdlgg.cpp index 6158e8d0e6..d993b94ae7 100644 --- a/src/generic/dirdlgg.cpp +++ b/src/generic/dirdlgg.cpp @@ -39,6 +39,7 @@ #include "wx/log.h" #include "wx/sizer.h" #include "wx/tokenzr.h" +#include "wx/dir.h" #if wxUSE_STATLINE #include "wx/statline.h" @@ -147,10 +148,7 @@ void wxDirItemData::SetNewDirName( wxString path ) bool wxDirItemData::HasSubDirs() { - wxString search = m_path + wxT("/*"); - wxLogNull log; - wxString path = wxFindFirstFile( search, wxDIR ); - return (bool)(!path.IsNull()); + return wxDir(m_path).HasSubDirs(); } //----------------------------------------------------------------------------- @@ -315,27 +313,19 @@ void wxDirCtrl::OnExpandItem(wxTreeEvent &event) wxDirItemData *data = (wxDirItemData *)GetItemData(event.GetItem()); wxASSERT(data); - wxString search,path,filename; - m_paths.Clear(); m_names.Clear(); -#ifdef __WXMSW__ - search = data->m_path + _T("\\*.*"); -#else - search = data->m_path + _T("/*"); -#endif - for (path = wxFindFirstFile( search, wxDIR ); !path.IsNull(); - path=wxFindNextFile() ) + + wxDir dir(data->m_path); + + wxString filename; + bool cont = dir.GetFirst(&filename, "", wxDIR_DIRS | wxDIR_HIDDEN); + while ( cont ) { - filename = wxFileNameFromPath( path ); - /* Don't add "." and ".." to the tree. I think wxFindNextFile - * also checks this, but I don't quite understand what happens - * there. Also wxFindNextFile seems to swallow hidden dirs */ - if ( (filename != _T(".")) && (filename != _T("..")) ) - { - m_paths.Add(path); - m_names.Add(filename); - } + m_paths.Add(data->m_path); + m_names.Add(filename); + + cont = dir.GetNext(&filename); } CreateItems( event.GetItem() );