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:
@@ -107,12 +107,10 @@ public:
|
|||||||
bool GetNext(wxString *filename) const;
|
bool GetNext(wxString *filename) const;
|
||||||
|
|
||||||
// return true if this directory has any files in it
|
// return true if this directory has any files in it
|
||||||
bool HasFiles(const wxString& spec = wxEmptyString)
|
bool HasFiles(const wxString& spec = wxEmptyString);
|
||||||
{ wxString s; return GetFirst(&s, spec, wxDIR_FILES | wxDIR_HIDDEN); }
|
|
||||||
|
|
||||||
// return true if this directory has any subdirectories
|
// return true if this directory has any subdirectories
|
||||||
bool HasSubDirs(const wxString& spec = wxEmptyString)
|
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
|
// enumerate all files in this directory and its subdirectories
|
||||||
//
|
//
|
||||||
|
@@ -43,6 +43,29 @@
|
|||||||
// implementation
|
// 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()
|
// wxDir::Traverse()
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -37,6 +37,8 @@
|
|||||||
#include "wx/filefn.h" // for wxMatchWild
|
#include "wx/filefn.h" // for wxMatchWild
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
|
|
||||||
@@ -283,3 +285,49 @@ bool wxDir::GetNext(wxString *filename) const
|
|||||||
|
|
||||||
return M_DIR->Read(filename);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user