X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fstd%2Fsrc%2FbbstdFilesFromDirectory.cxx;h=7560fd896335b377d8a6803593fc3d2304aee2a9;hb=8654fac291feca76ace7256d3f38e92edfb35919;hp=d7c747e660d7e3638f77a9a100168d92c12dcceb;hpb=9ec0d27e7a99329b32311fa693dca4a389b89833;p=bbtk.git diff --git a/packages/std/src/bbstdFilesFromDirectory.cxx b/packages/std/src/bbstdFilesFromDirectory.cxx index d7c747e..7560fd8 100644 --- a/packages/std/src/bbstdFilesFromDirectory.cxx +++ b/packages/std/src/bbstdFilesFromDirectory.cxx @@ -1,5 +1,33 @@ +/* + # --------------------------------------------------------------------- + # + # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image + # pour la SantÈ) + # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton + # Previous Authors : Laurent Guigues, Jean-Pierre Roux + # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil + # + # This software is governed by the CeCILL-B license under French law and + # abiding by the rules of distribution of free software. You can use, + # modify and/ or redistribute the software under the terms of the CeCILL-B + # license as circulated by CEA, CNRS and INRIA at the following URL + # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + # or in the file LICENSE.txt. + # + # As a counterpart to the access to the source code and rights to copy, + # modify and redistribute granted by the license, users are provided only + # with a limited warranty and the software's author, the holder of the + # economic rights, and the successive licensors have only limited + # liability. + # + # The fact that you are presently reading this means that you have had + # knowledge of the CeCILL-B license and that you accept its terms. + # ------------------------------------------------------------------------ */ + + #include "bbstdFilesFromDirectory.h" #include "bbstdPackage.h" +#include #ifdef _MSC_VER #include @@ -19,32 +47,31 @@ BBTK_BLACK_BOX_IMPLEMENTATION(FilesFromDirectory,bbtk::AtomicBlackBox); void FilesFromDirectory::Process() { - - DirName = bbGetInputIn(); - bool rec = bbGetInputRecursive(); - /*int nbFiles = */ Explore(DirName, rec); - bbSetOutputOut(Filenames); - - + Filenames.clear(); + SimpleFilenames.clear(); + DirName = bbGetInputIn(); + bool rec = bbGetInputRecursive(); + /*int nbFiles = */ Explore(DirName, rec); + CleanFilenames( bbGetInputIn() ); + bbSetOutputOut(Filenames); + bbSetOutputOutSimple(SimpleFilenames); } -void FilesFromDirectory::bbUserConstructor() -{ +void FilesFromDirectory::bbUserSetDefaultValues() +{ bbSetInputIn("."); - bbSetInputRecursive(false); - + bbSetInputRecursive(false); + bbSetInputType(0); } -void FilesFromDirectory::bbUserCopyConstructor(bbtk::BlackBox::Pointer) -{ - +void FilesFromDirectory::bbUserInitializeProcessing() +{ } -void FilesFromDirectory::bbUserDestructor() -{ - +void FilesFromDirectory::bbUserFinalizeProcessing() +{ } - + /** * \brief Add a SEPARATOR to the end of the name if necessary * @param pathname file/directory name to normalize @@ -52,7 +79,7 @@ void FilesFromDirectory::bbUserDestructor() std::string FilesFromDirectory::NormalizePath(std::string const &pathname) { #ifdef _WIN32 - const char FILESEPARATOR = '\\; + const char FILESEPARATOR = '\\'; #else const char FILESEPARATOR = '/'; #endif @@ -73,8 +100,268 @@ std::string FilesFromDirectory::NormalizePath(std::string const &pathname) * @param dirpath directory to explore * @param recursive whether we want recursion or not */ + + + +int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive) +{ + int numberOfFiles = 0; + std::string dirName = NormalizePath(dirpath); + int tmpNumberOfFiles; + std::string fileName; +#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 ) + { + if (bbGetInputType()==1) + { + std::string temp = dirName+fileName; + Filenames.push_back(temp); + numberOfFiles++; + } // Type ALL_directories + + tmpNumberOfFiles = Explore(dirName+fileName, recursive); + if ((bbGetInputType()==2)&&tmpNumberOfFiles==0) + { + std::string temp = dirName+fileName; + Filenames.push_back(temp); + numberOfFiles++; + } // Type Lsast_directories + + numberOfFiles = numberOfFiles + tmpNumberOfFiles; + } // if recursive + if ( fileName != "." && fileName != ".." && !recursive ) + if ((bbGetInputType()==1) || (bbGetInputType()==2)) + { + std::string temp = dirName+fileName; + Filenames.push_back(temp); + numberOfFiles++; + } // Type All_directories + }// fileName && !recursive + } else { +// std::string temp = "\"" +dirName+fileName + "\""; + std::string temp = dirName+fileName; + +/* + std::string::size_type spacePosition = temp.find_first_of(' '); + if (spacePosition != std::string::npos) + { + std::cout << "=========================================== File name : [" <d_name; + std::string temp = fileName; + if( stat(fileName.c_str(), &buf) != 0 ) + { + //gdcmErrorMacro( strerror(errno) ); + } // stat + if ( S_ISREG(buf.st_mode) ) //is it a regular file? + { + if ( d->d_name[0]!='.') + { + +/* + std::string::size_type spacePosition = temp.find_first_of(' '); + if (spacePosition != std::string::npos) + { + std::cout << "=========================================== File name : [" <d_name[0]!='.') && recursive ) //we also skip hidden files + { + if (bbGetInputType()==1) + { + Filenames.push_back(fileName); + numberOfFiles++; + } // Type All_directories + + tmpNumberOfFiles = Explore( fileName, recursive); + if ((bbGetInputType()==2)&&tmpNumberOfFiles==0) + { + Filenames.push_back(fileName); + numberOfFiles++; + } // Type Lsast_directories + numberOfFiles = numberOfFiles+tmpNumberOfFiles; + }// d_name && recursive + if ( (d->d_name[0]!='.') && !recursive ) { //we also skip hidden files + if ((bbGetInputType()==1) || (bbGetInputType()==2)) + { + Filenames.push_back(fileName); + numberOfFiles++; + } // Type All_directories + + }// d_name && !recursive + + } else { + //gdcmErrorMacro( "Unexpected error" ); + return -1; + } // Regular FILE + } + if( closedir(dir) != 0 ) + { + //gdcmErrorMacro( strerror(errno) ); + }// closedir +#endif + + + return numberOfFiles; +} + + +//------------------------------------------------------------------------------ +void FilesFromDirectory::CleanFilenames( std::string basePath ) +{ + std::string tmpString; + int i,ii,sizeFilenames = Filenames.size(); + int j,sizeFileEnd = bbGetInputFileEnd().size(); + + int okEraseElement; + +//Selecting just the files in the FileEnd List + if (bbGetInputFileEnd().size()!=0) + { + for (i=sizeFilenames-1; i>=0; i--) + { + okEraseElement=0; + for (j=0; jFilenames[ii]) + { + tmpString=Filenames[i]; + Filenames[i]=Filenames[ii]; + Filenames[ii]=tmpString; + } // if + } // for ii + } // for i + +// Creating SimpleFilenames + unsigned int lenghtBasePath = basePath.length(); + for (i=0; id_name; + std::string temp = fileName; 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++; + if ( d->d_name[0]!='.') + { + + std::string::size_type spacePosition = temp.find_first_of(' '); + if (spacePosition != std::string::npos) + { + std::cout << "=========================================== File name : [" <Filenames[ii]) + { + tmpString=Filenames[i]; + Filenames[i]=Filenames[ii]; + Filenames[ii]=tmpString; + } // if + } // for ii + } // for i + return numberOfFiles; } - +*/ } // EO namespace bbstd