]> git.saurik.com Git - wxWidgets.git/commitdiff
implemented wxDir::HasSubDirs() optimization for Unix
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 28 Aug 2001 13:48:53 +0000 (13:48 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 28 Aug 2001 13:48:53 +0000 (13:48 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11498 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dir.h
src/common/dircmn.cpp
src/unix/dir.cpp

index 4c8a2368cb7edcebf70ecd2805c86b79eccf9bfb..43dddce6424c8a2600fa8e046f88375246ee6ffe 100644 (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
     //
index 2fa41e06da709fa6bf61a508e6a451aae3abda39..ca35534dcf8b15c5f6e43c2b8fdd1e2ea639923a 100644 (file)
 // 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()
 // ----------------------------------------------------------------------------
index 8364eddf5a86771765ed3b3b6d2b8bfce8aa9256..95f2e78f191d1094ecf4ed0db2d829ac8a30004f 100644 (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);
+}
+