From 006fb95f5950916098ebb8079d54ed4acc515870 Mon Sep 17 00:00:00 2001
From: Ken Martin <ken.martin@kitware.com>
Date: Thu, 22 Jun 2006 10:35:37 -0400
Subject: [PATCH] ENH: add a higher performance method to get the number of
 files in a directory

---
 Directory.cxx    | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
 Directory.hxx.in |  6 +++++
 2 files changed, 65 insertions(+)

diff --git a/Directory.cxx b/Directory.cxx
index a7d1099..3fb4d6d 100644
--- a/Directory.cxx
+++ b/Directory.cxx
@@ -143,6 +143,47 @@ bool Directory::Load(const char* name)
   return _findclose(srchHandle) != -1;
 }
 
+unsigned long Directory::GetNumberOfFilesInDirectory(const char* name)
+{
+#if _MSC_VER < 1300
+  long srchHandle;
+#else
+  intptr_t srchHandle;
+#endif
+  char* buf;
+  size_t n = strlen(name);
+  if ( name[n - 1] == '/' )
+    {
+    buf = new char[n + 1 + 1];
+    sprintf(buf, "%s*", name);
+    }
+  else
+    {
+    buf = new char[n + 2 + 1];
+    sprintf(buf, "%s/*", name);
+    }
+  struct _finddata_t data;      // data of current file
+
+  // Now put them into the file array
+  srchHandle = _findfirst(buf, &data);
+  delete [] buf;
+
+  if ( srchHandle == -1 )
+    {
+    return 0;
+    }
+
+  // Loop through names
+  unsigned long count = 0;
+  do
+    {
+    count++;
+    }
+  while ( _findnext(srchHandle, &data) != -1 );
+  _findclose(srchHandle);
+  return count;
+}
+
 } // namespace KWSYS_NAMESPACE
 
 #else
@@ -174,6 +215,24 @@ bool Directory::Load(const char* name)
   return 1;
 }
 
+unsigned long Directory::GetNumberOfFilesInDirectory(const char* name)
+{
+  DIR* dir = opendir(name);
+
+  if (!dir)
+    {
+    return 0;
+    }
+
+  unsigned long count = 0;
+  for (dirent* d = readdir(dir); d; d = readdir(dir) )
+    {
+    count++;
+    }
+  closedir(dir);
+  return count;
+}
+
 } // namespace KWSYS_NAMESPACE
 
 #endif
diff --git a/Directory.hxx.in b/Directory.hxx.in
index d4b9bab..a46d76e 100644
--- a/Directory.hxx.in
+++ b/Directory.hxx.in
@@ -47,6 +47,12 @@ public:
    */
   unsigned long GetNumberOfFiles() const;
 
+  /**
+   * Return the number of files in the specified directory.
+   * A higher performance static method.
+   */
+  static unsigned long GetNumberOfFilesInDirectory(const char*);
+
   /**
    * Return the file at the given index, the indexing is 0 based
    */
-- 
GitLab