implemented wxDir::HasSubDirs() optimization for Unix

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11498 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2001-08-28 13:48:53 +00:00
parent 7e410431f3
commit 1357a7dd5c
3 changed files with 73 additions and 4 deletions

View File

@@ -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
//

View File

@@ -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()
// ----------------------------------------------------------------------------

View File

@@ -37,6 +37,8 @@
#include "wx/filefn.h" // for wxMatchWild
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>
@@ -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);
}