| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- /*=========================================================================
- Program: KWSys - Kitware System Library
- Module: $RCSfile$
- Copyright (c) Kitware, Inc., Insight Consortium. All rights reserved.
- See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
- This software is distributed WITHOUT ANY WARRANTY; without even
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- PURPOSE. See the above copyright notices for more information.
- =========================================================================*/
- #include "kwsysPrivate.h"
- #include KWSYS_HEADER(Directory.hxx)
- #include KWSYS_HEADER(Configure.hxx)
- #include KWSYS_HEADER(stl/string)
- #include KWSYS_HEADER(stl/vector)
- // Work-around CMake dependency scanning limitation. This must
- // duplicate the above list of headers.
- #if 0
- # include "Directory.hxx.in"
- # include "Configure.hxx.in"
- # include "kwsys_stl.hxx.in"
- # include "kwsys_stl_string.hxx.in"
- # include "kwsys_stl_vector.hxx.in"
- #endif
- namespace KWSYS_NAMESPACE
- {
- //----------------------------------------------------------------------------
- class DirectoryInternals
- {
- public:
- // Array of Files
- kwsys_stl::vector<kwsys_stl::string> Files;
- // Path to Open'ed directory
- kwsys_stl::string Path;
- };
- //----------------------------------------------------------------------------
- Directory::Directory()
- {
- this->Internal = new DirectoryInternals;
- }
- //----------------------------------------------------------------------------
- Directory::~Directory()
- {
- delete this->Internal;
- }
- //----------------------------------------------------------------------------
- unsigned long Directory::GetNumberOfFiles() const
- {
- return static_cast<unsigned long>(this->Internal->Files.size());
- }
- //----------------------------------------------------------------------------
- const char* Directory::GetFile(unsigned long dindex) const
- {
- if ( dindex >= this->Internal->Files.size() )
- {
- return 0;
- }
- return this->Internal->Files[dindex].c_str();
- }
- //----------------------------------------------------------------------------
- const char* Directory::GetPath() const
- {
- return this->Internal->Path.c_str();
- }
- //----------------------------------------------------------------------------
- void Directory::Clear()
- {
- this->Internal->Path.resize(0);
- this->Internal->Files.clear();
- }
- } // namespace KWSYS_NAMESPACE
- // First microsoft compilers
- #if defined(_MSC_VER) || defined(__WATCOMC__)
- #include <windows.h>
- #include <io.h>
- #include <ctype.h>
- #include <fcntl.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- namespace KWSYS_NAMESPACE
- {
- bool Directory::Load(const char* name)
- {
- this->Clear();
- #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
- do
- {
- this->Internal->Files.push_back(data.name);
- }
- while ( _findnext(srchHandle, &data) != -1 );
- this->Internal->Path = 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
- // Now the POSIX style directory access
- #include <sys/types.h>
- #include <dirent.h>
- /* There is a problem with the Portland compiler, large file
- support and glibc/Linux system headers:
- http://www.pgroup.com/userforum/viewtopic.php?
- p=1992&sid=f16167f51964f1a68fe5041b8eb213b6
- */
- #if defined(__PGI) && defined(__USE_FILE_OFFSET64)
- # define dirent dirent64
- #endif
- namespace KWSYS_NAMESPACE
- {
- bool Directory::Load(const char* name)
- {
- this->Clear();
-
- if (!name)
- {
- return 0;
- }
- DIR* dir = opendir(name);
- if (!dir)
- {
- return 0;
- }
- for (dirent* d = readdir(dir); d; d = readdir(dir) )
- {
- this->Internal->Files.push_back(d->d_name);
- }
- this->Internal->Path = name;
- closedir(dir);
- 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
|