1 /*=========================================================================
4 Module: $RCSfile: creaFilesFromDirectory.cxx,v $
6 Date: $Date: 2009/04/14 12:54:38 $
7 Version: $Revision: 1.5 $
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"
37 #include "creaMessageManager.h"
43 * \brief Add a SEPARATOR to the end of the name if necessary
44 * @param pathname file/directory name to normalize
46 std::string DirList::NormalizePath(std::string const &pathname)
51 const char FILESEPARATOR = '\\';
53 const char FILESEPARATOR = '/';
57 std::string name = pathname;
58 int size = name.size();
60 // if ( name[size-1] != SEPARATOR_X && name[size-1] != SEPARATOR_WIN )
61 if ( name[size-1] != FILESEPARATOR )
63 name += FILESEPARATOR;
68 * \brief Explore a directory with possibility of recursion
69 * return number of files read
70 * @param dirpath directory to explore
71 * @param recursive whether we want recursion or not
73 int DirList::Explore(std::string const &dirpath, bool recursive)
75 int numberOfFiles = 0;
77 std::string dirName = NormalizePath(dirpath);
79 WIN32_FIND_DATA fileData;
80 //assert( dirName[dirName.size()-1] == '' );
81 HANDLE hFile = FindFirstFile((dirName+"*").c_str(), &fileData);
83 for(BOOL b = (hFile != INVALID_HANDLE_VALUE); b;
84 b = FindNextFile(hFile, &fileData))
86 fileName = fileData.cFileName;
87 if ( fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
89 // Need to check for . and .. to avoid infinite loop
90 if ( fileName != "." && fileName != ".." && recursive )
92 numberOfFiles += Explore(dirName+fileName,recursive);
97 Filenames.push_back(dirName+fileName);
101 DWORD dwError = GetLastError();
102 if (hFile != INVALID_HANDLE_VALUE)
104 if (dwError != ERROR_NO_MORE_FILES)
107 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
108 FORMAT_MESSAGE_FROM_SYSTEM|
109 FORMAT_MESSAGE_IGNORE_INSERTS,
111 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
112 (LPTSTR) &lpMsgBuf,0,NULL);
114 creaError("FindNextFile error. Error is " << (char *)lpMsgBuf
115 <<" for the directory : "<<dirName);
120 // Real POSIX implementation: scandir is a BSD extension only, and doesn't
121 // work on debian for example
123 DIR* dir = opendir(dirName.c_str());
129 // According to POSIX, the dirent structure contains a field char d_name[]
130 // of unspecified size, with at most NAME_MAX characters preceeding the
131 // terminating null character. Use of other fields will harm the porta-
132 // bility of your programs.
136 for (d = readdir(dir); d; d = readdir(dir))
139 fileName = dirName + d->d_name;
140 if( stat(fileName.c_str(), &buf) != 0 )
142 //gdcmErrorMacro( strerror(errno) );
144 if ( S_ISREG(buf.st_mode) ) //is it a regular file?
146 //printf("EED DirList::Explore [%s]\n" , d->d_name );
147 if ( d->d_name[0]!='.')
149 Filenames.push_back( fileName );
153 else if ( S_ISDIR(buf.st_mode) ) //directory?
155 if ( d->d_name[0] != '.' && recursive ) //we also skip hidden files
157 numberOfFiles += Explore( fileName, recursive);
162 //gdcmErrorMacro( "Unexpected error" );
166 if( closedir(dir) != 0 )
168 //gdcmErrorMacro( strerror(errno) );
172 return numberOfFiles;