From 1357a7dd5c4b56a96f749c4b83f3f646afc18620 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 28 Aug 2001 13:48:53 +0000 Subject: [PATCH] implemented wxDir::HasSubDirs() optimization for Unix git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11498 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/dir.h | 6 ++---- src/common/dircmn.cpp | 23 +++++++++++++++++++++ src/unix/dir.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/include/wx/dir.h b/include/wx/dir.h index 4c8a2368cb..43dddce642 100644 --- a/include/wx/dir.h +++ b/include/wx/dir.h @@ -107,12 +107,10 @@ public: 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); } + bool HasFiles(const wxString& spec = wxEmptyString); // return true if this directory has any subdirectories - bool HasSubDirs(const wxString& spec = wxEmptyString) - { wxString s; return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN); } + bool HasSubDirs(const wxString& spec = wxEmptyString); // enumerate all files in this directory and its subdirectories // diff --git a/src/common/dircmn.cpp b/src/common/dircmn.cpp index 2fa41e06da..ca35534dcf 100644 --- a/src/common/dircmn.cpp +++ b/src/common/dircmn.cpp @@ -43,6 +43,29 @@ // implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// wxDir::HasFiles() and HasSubDirs() +// ---------------------------------------------------------------------------- + +// dumb generic implementation + +bool wxDir::HasFiles(const wxString& spec) +{ + wxString s; + return GetFirst(&s, spec, wxDIR_FILES | wxDIR_HIDDEN); +} + +// we have a (much) faster version for Unix +#ifndef __UNIX_LIKE__ + +bool wxDir::HasSubDirs(const wxString& spec) +{ + wxString s; + return GetFirst(&s, spec, wxDIR_DIRS | wxDIR_HIDDEN); +} + +#endif // !Unix + // ---------------------------------------------------------------------------- // wxDir::Traverse() // ---------------------------------------------------------------------------- diff --git a/src/unix/dir.cpp b/src/unix/dir.cpp index 8364eddf5a..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 @@ -283,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); +} + -- 2.45.2