1 /*=========================================================================
4 Module: $RCSfile: creaFilesFromDirectory.cxx,v $
6 Date: $Date: 2008/11/25 13:15:57 $
7 Version: $Revision: 1.1 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/crea/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
22 * \brief class Exception:generic class for throwing any exception (header)
31 #include <sys/types.h>
34 #include <sys/stat.h> //stat function
36 #include "creaFilesFromDirectory.h"
42 * \brief Add a SEPARATOR to the end of the name if necessary
43 * @param pathname file/directory name to normalize
45 std::string DirList::NormalizePath(std::string const &pathname)
50 const char FILESEPARATOR = '\\;
52 const char FILESEPARATOR = '/';
55 std::string name = pathname;
56 int size = name.size();
58 // if ( name[size-1] != SEPARATOR_X && name[size-1] != SEPARATOR_WIN )
59 if ( name[size-1] != FILESEPARATOR )
61 name += FILESEPARATOR;
66 * \brief Explore a directory with possibility of recursion
67 * return number of files read
68 * @param dirpath directory to explore
69 * @param recursive whether we want recursion or not
71 int DirList::Explore(std::string const &dirpath, bool recursive)
73 int numberOfFiles = 0;
75 std::string dirName = NormalizePath(dirpath);
77 WIN32_FIND_DATA fileData;
78 //assert( dirName[dirName.size()-1] == '' );
79 HANDLE hFile = FindFirstFile((dirName+"*").c_str(), &fileData);
81 for(BOOL b = (hFile != INVALID_HANDLE_VALUE); b;
82 b = FindNextFile(hFile, &fileData))
84 fileName = fileData.cFileName;
85 if ( fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
87 // Need to check for . and .. to avoid infinite loop
88 if ( fileName != "." && fileName != ".." && recursive )
90 numberOfFiles += Explore(dirName+fileName,recursive);
95 Filenames.push_back(dirName+fileName);
99 DWORD dwError = GetLastError();
100 if (hFile != INVALID_HANDLE_VALUE)
102 if (dwError != ERROR_NO_MORE_FILES)
105 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
106 FORMAT_MESSAGE_FROM_SYSTEM|
107 FORMAT_MESSAGE_IGNORE_INSERTS,
109 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
110 (LPTSTR) &lpMsgBuf,0,NULL);
112 gdcmErrorMacro("FindNextFile error. Error is " << (char *)lpMsgBuf
113 <<" for the directory : "<<dirName);
118 // Real POSIX implementation: scandir is a BSD extension only, and doesn't
119 // work on debian for example
121 DIR* dir = opendir(dirName.c_str());
127 // According to POSIX, the dirent structure contains a field char d_name[]
128 // of unspecified size, with at most NAME_MAX characters preceeding the
129 // terminating null character. Use of other fields will harm the porta-
130 // bility of your programs.
134 for (d = readdir(dir); d; d = readdir(dir))
136 fileName = dirName + d->d_name;
137 if( stat(fileName.c_str(), &buf) != 0 )
139 //gdcmErrorMacro( strerror(errno) );
141 if ( S_ISREG(buf.st_mode) ) //is it a regular file?
143 Filenames.push_back( fileName );
146 else if ( S_ISDIR(buf.st_mode) ) //directory?
148 if ( d->d_name[0] != '.' && recursive ) //we also skip hidden files
150 numberOfFiles += Explore( fileName, recursive);
155 //gdcmErrorMacro( "Unexpected error" );
159 if( closedir(dir) != 0 )
161 //gdcmErrorMacro( strerror(errno) );
165 return numberOfFiles;