X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/353327844e319db755c2e7a07a4cf5b53cef35c4..e7e1b01eb55e59e555860c7ce181f176b8bbf4e2:/src/unix/dir.cpp diff --git a/src/unix/dir.cpp b/src/unix/dir.cpp index 13b8d2a68a..95f2e78f19 100644 --- a/src/unix/dir.cpp +++ b/src/unix/dir.cpp @@ -37,6 +37,8 @@ #include "wx/filefn.h" // for wxMatchWild #include +#include +#include #include @@ -117,9 +119,14 @@ wxDirData::~wxDirData() bool wxDirData::Read(wxString *filename) { - dirent *de = (dirent *)NULL; // just to silent compiler warnings + dirent *de = (dirent *)NULL; // just to silence compiler warnings bool matches = FALSE; + // speed up string concatenation in the loop a bit + wxString path = m_dirname; + path += _T('/'); + path.reserve(path.length() + 255); + while ( !matches ) { de = readdir(m_dir); @@ -133,24 +140,25 @@ bool wxDirData::Read(wxString *filename) { if ( !(m_flags & wxDIR_DOTDOT) ) continue; + + // we found a valid match + break; } // check the type now - if ( !(m_flags & wxDIR_FILES) && - !wxDir::Exists(m_dirname + _T('/') + de->d_name) ) + if ( !(m_flags & wxDIR_FILES) && !wxDir::Exists(path + de->d_name) ) { // it's a file, but we don't want them continue; } - else if ( !(m_flags & wxDIR_DIRS) && - wxDir::Exists(m_dirname + _T('/') + de->d_name) ) + else if ( !(m_flags & wxDIR_DIRS) && wxDir::Exists(path + de->d_name) ) { // it's a dir, and we don't want it continue; } // finally, check the name - if ( !m_filespec ) + if ( m_filespec.empty() ) { matches = m_flags & wxDIR_HIDDEN ? TRUE : de->d_name[0] != '.'; } @@ -277,3 +285,49 @@ bool wxDir::GetNext(wxString *filename) const return M_DIR->Read(filename); } + +bool wxDir::HasSubDirs(const wxString& spec) +{ + wxCHECK_MSG( IsOpened(), FALSE, _T("must wxDir::Open() first") ); + + if ( spec.empty() ) + { + // faster check for presence of any subdirectory: normally each subdir + // has a hard link to the parent directory and so, knowing that there + // are at least "." and "..", we have a subdirectory if and only if + // links number is > 2 - this is just a guess but it works fairly well + // in practice + // + // note that we may guess wrongly in one direction only: i.e. we may + // return true when there are no subdirectories but this is ok as the + // caller will learn it soon enough when it calls GetFirst(wxDIR) + // anyhow + wxStructStat stBuf; + if ( wxStat(M_DIR->GetName(), &stBuf) == 0 ) + { + switch ( stBuf.st_nlink ) + { + case 2: + // just "." and ".." + return FALSE; + + case 0: + case 1: + // weird filesystem, don't try to guess for it, use dumb + // method below + break; + + default: + // assume we have subdirs - may turn out to be wrong if we + // have other hard links to this directory but it's not + // that bad as explained above + return TRUE; + } + } + } + + // just try to find first directory + wxString s; + return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN); +} +