-// ===================================================================================
-/**
- * \brief Explore a directory with possibility of recursion
- * return number of files read
- * @param dirpath directory to explore
- * @param recursive whether we want recursion or not
- */
-static int Explore(std::string const &dirpath, bool recursive, std::vector<std::string> &Filenames)
-{
- int numberOfFiles = 0;
- std::string fileName;
-
- std::string dirName = dirpath;
-
-#ifdef _MSC_VER
- WIN32_FIND_DATA fileData;
- HANDLE hFile = FindFirstFile((dirName+"*").c_str(), &fileData);
-
- for(BOOL b = (hFile != INVALID_HANDLE_VALUE); b;
- b = FindNextFile(hFile, &fileData))
- {
- fileName = fileData.cFileName;
- if ( fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
- {
- // Need to check for . and .. to avoid infinite loop
- if ( fileName != "." && fileName != ".." && recursive )
- {
- numberOfFiles += Explore(dirName+ "\\"+fileName,recursive,Filenames);
- }
- }
- else
- {
- Filenames.push_back(dirName+fileName);
- numberOfFiles++;
- }
- }
- DWORD dwError = GetLastError();
- if (hFile != INVALID_HANDLE_VALUE)
- FindClose(hFile);
- if (dwError != ERROR_NO_MORE_FILES)
- {
- LPVOID lpMsgBuf;
- FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
- FORMAT_MESSAGE_FROM_SYSTEM|
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,GetLastError(),
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- (LPTSTR) &lpMsgBuf,0,NULL);
-
- // ErrorMacro("FindNextFile error. Error is " << (char *)lpMsgBuf
- // <<" for the directory : "<<dirName);
-
- return 0;
- }
-
-#else
- // Real POSIX implementation: scandir is a BSD extension only, and doesn't
- // work on debian for example
-//std::cout <<"in Explor dirname[" << dirName << "]" << std::endl;
- DIR* dir = opendir(dirName.c_str());
- if (!dir)
- {
- return 0;
- }
-//std::cout <<"Open OK" << std::endl;
- // According to POSIX, the dirent structure contains a field char d_name[]
- // of unspecified size, with at most NAME_MAX characters preceeding the
- // terminating null character. Use of other fields will harm the porta-
- // bility of your programs.
-
- struct stat buf;
- dirent *d;
- for (d = readdir(dir); d; d = readdir(dir))
- {
- fileName = dirName + "/" + d->d_name;
-//std::cout <<"in Explor filename[" << fileName << "]" << std::endl;
- if( stat(fileName.c_str(), &buf) != 0 )
- {
- //ErrorMacro( strerror(errno) );
- }
- if ( S_ISREG(buf.st_mode) ) //is it a regular file?
- {
- Filenames.push_back( fileName );
- numberOfFiles++;
- }
- else if ( S_ISDIR(buf.st_mode) ) //directory?
- {
- if ( d->d_name[0] != '.' && recursive ) //we also skip hidden files
- {
- numberOfFiles += Explore( fileName, recursive, Filenames);
- }
- }
- else
- {
- //ErrorMacro( "Unexpected error" );
- return -1;
- }
- }
- if( closedir(dir) != 0 )
- {
- // ErrorMacro( strerror(errno) );
- }
-#endif