From: jean-pierre roux Date: Tue, 25 Nov 2008 13:15:57 +0000 (+0000) Subject: Class to return names of the files within a directory (recursive exploration or X-Git-Tag: v0.2.0~21 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=ba499d06876469f701625fd801256652b3f591d9;p=crea.git Class to return names of the files within a directory (recursive exploration or not) --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 27b0750..c39fd66 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -28,6 +28,7 @@ SET( SRCS creaRTTI creawxVTKRenderWindowInteractor creaVtkBasicSlicer + creaFilesFromDirectory ) diff --git a/src/creaFilesFromDirectory.cxx b/src/creaFilesFromDirectory.cxx new file mode 100644 index 0000000..2d9f215 --- /dev/null +++ b/src/creaFilesFromDirectory.cxx @@ -0,0 +1,168 @@ +/*========================================================================= + + Program: crea + Module: $RCSfile: creaFilesFromDirectory.cxx,v $ + Language: C++ + Date: $Date: 2008/11/25 13:15:57 $ + Version: $Revision: 1.1 $ + + Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de + l'Image). All rights reserved. See Doc/License.txt or + http://www.creatis.insa-lyon.fr/Public/crea/License.html 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. + +=========================================================================*/ + + +/** + * \file + * \brief class Exception:generic class for throwing any exception (header) + * + * Long description: + */ +#ifdef _MSC_VER + #include + #include +#else + #include + #include +#endif + +#include //stat function + + #include "creaFilesFromDirectory.h" + +namespace crea +{ + +/** + * \brief Add a SEPARATOR to the end of the name if necessary + * @param pathname file/directory name to normalize + */ +std::string DirList::NormalizePath(std::string const &pathname) +{ + + +#ifdef _WIN32 + const char FILESEPARATOR = '\\; +#else + const char FILESEPARATOR = '/'; +#endif + + std::string name = pathname; + int size = name.size(); + +// if ( name[size-1] != SEPARATOR_X && name[size-1] != SEPARATOR_WIN ) + if ( name[size-1] != FILESEPARATOR ) + { + name += FILESEPARATOR; + } + return name; +} +/** + * \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 + */ +int DirList::Explore(std::string const &dirpath, bool recursive) +{ + int numberOfFiles = 0; + std::string fileName; + std::string dirName = NormalizePath(dirpath); +#ifdef _MSC_VER + WIN32_FIND_DATA fileData; + //assert( dirName[dirName.size()-1] == '' ); + 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); + } + } + 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); + + gdcmErrorMacro("FindNextFile error. Error is " << (char *)lpMsgBuf + <<" for the directory : "<d_name; + if( stat(fileName.c_str(), &buf) != 0 ) + { + //gdcmErrorMacro( 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); + } + } + else + { + //gdcmErrorMacro( "Unexpected error" ); + return -1; + } + } + if( closedir(dir) != 0 ) + { + //gdcmErrorMacro( strerror(errno) ); + } +#endif + + return numberOfFiles; +} + +} diff --git a/src/creaFilesFromDirectory.h b/src/creaFilesFromDirectory.h new file mode 100644 index 0000000..6b9bd7a --- /dev/null +++ b/src/creaFilesFromDirectory.h @@ -0,0 +1,47 @@ +#ifndef _crea_DIRLIST_H_ +#define _crea_DIRLIST_H_ + + + +#include +#include +#include + +namespace crea +{ +class DirList +{ +public : + DirList(std::string const &dirName, bool recursive); + ~DirList(); + + + std::string NormalizePath(std::string const &pathname); + + /// Return the name of the directory + std::string const &GetDirName() const { return DirName; } + + /// Return the file names + std::vector const &GetFilenames() const { return Filenames; } + + /// Return the number of Files + int GetSize() const { return Filenames.size(); } + + static bool IsDirectory(std::string const &dirName); + + std::string GetFirst(); + std::string GetNext(); + +private : + int Explore(std::string const &dirName, bool recursive=false); + + /// List of file names + std::vector Filenames; + /// name of the root directory to explore + std::string DirName; + +}; + +} + +#endif