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

This commit is contained in:
Ken Martin 2006-06-22 10:35:37 -04:00
parent 55b0935a79
commit 847c3a5849
3 changed files with 67 additions and 3 deletions

View File

@ -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";

View File

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

View File

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