Forráskód Böngészése

ENH: add a higher performance method to get the number of files in a directory

Ken Martin 19 éve
szülő
commit
847c3a5849
3 módosított fájl, 67 hozzáadás és 3 törlés
  1. 2 3
      Source/cmake.cxx
  2. 59 0
      Source/kwsys/Directory.cxx
  3. 6 0
      Source/kwsys/Directory.hxx.in

+ 2 - 3
Source/cmake.cxx

@@ -1024,9 +1024,8 @@ int cmake::ExecuteCMakeCommand(std::vector<std::string>& args)
           fclose(progFile);
           }
         }
-      cmsys::Directory dir;
-      dir.Load(dirName.c_str());
-      int fileNum = static_cast<int>(dir.GetNumberOfFiles());
+      int fileNum = static_cast<int>
+        (cmsys::Directory::GetNumberOfFilesInDirectory(dirName.c_str()));
       // read the count
       fName = dirName;
       fName += "/count.txt";

+ 59 - 0
Source/kwsys/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

+ 6 - 0
Source/kwsys/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
    */