]> Creatis software - bbtk.git/blobdiff - packages/std/src/bbstdFilesFromDirectory.cxx
#3043 BBTK Bug New Normal - FilesFromDirectoryBox missing directories AND Refresh...
[bbtk.git] / packages / std / src / bbstdFilesFromDirectory.cxx
index 1aefdb16e4005719a68219f62bb9b1cf6b79fb1e..7560fd896335b377d8a6803593fc3d2304aee2a9 100644 (file)
@@ -48,9 +48,10 @@ BBTK_BLACK_BOX_IMPLEMENTATION(FilesFromDirectory,bbtk::AtomicBlackBox);
 void FilesFromDirectory::Process()
 {
        Filenames.clear();
+       SimpleFilenames.clear();
        DirName         = bbGetInputIn();
        bool rec        = bbGetInputRecursive();
-       /*int nbFiles = */ Explore(DirName, rec);
+       /*int nbFiles = */ Explore(DirName, rec);
        CleanFilenames( bbGetInputIn() );
        bbSetOutputOut(Filenames);   
        bbSetOutputOutSimple(SimpleFilenames);   
@@ -113,7 +114,6 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
        //assert( dirName[dirName.size()-1] == '' );
        HANDLE hFile = FindFirstFile((dirName+"*").c_str(), &fileData);
 
-
        for(BOOL b = (hFile != INVALID_HANDLE_VALUE); b;
        b = FindNextFile(hFile, &fileData))
        {
@@ -125,19 +125,29 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
          {
                        if (bbGetInputType()==1)
                        {
-                               Filenames.push_back(fileName);   
-                               numberOfFiles++;
+                       std::string temp = dirName+fileName;
+                       Filenames.push_back(temp);       
+                       numberOfFiles++;
                        } // Type ALL_directories
 
                        tmpNumberOfFiles        =       Explore(dirName+fileName, recursive);
                        if ((bbGetInputType()==2)&&tmpNumberOfFiles==0)
                        {
-                       Filenames.push_back(fileName);   
+                       std::string temp = dirName+fileName;
+                       Filenames.push_back(temp);       
                        numberOfFiles++;
                        } // Type Lsast_directories
                        
                        numberOfFiles           =       numberOfFiles + tmpNumberOfFiles;
-         } // if
+         } // 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;
@@ -186,7 +196,7 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
   // Real POSIX implementation: scandir is a BSD extension only, and doesn't 
   // work on debian for example
 
-       DIR* dir = opendir(dirName.c_str());
+       DIR* dir = opendir( dirName.c_str() );
        if (!dir)
        {
                return 0;
@@ -230,7 +240,7 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
                                } // Type files
                } // d_name
        } else if ( S_ISDIR(buf.st_mode) ) {  //directory?
-               if ( d->d_name[0] != '.' && recursive ) //we also skip hidden files
+               if ( (d->d_name[0]!='.') && recursive ) //we also skip hidden files
                {
                                if (bbGetInputType()==1)
                                {
@@ -245,7 +255,16 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
                                numberOfFiles++;
                                } // Type Lsast_directories
                        numberOfFiles           = numberOfFiles+tmpNumberOfFiles;
-               } // d_name
+               }// 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;
@@ -267,11 +286,39 @@ 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; j<sizeFileEnd; j++)
+                       {
+                               std::string tmp=Filenames[i].substr( (Filenames[i].length()) - (bbGetInputFileEnd()[j]).length() ) ;
+                               if (bbGetInputFileEnd()[j].compare( tmp )==0 )
+                               {
+                                       okEraseElement++;
+                               } // if FileEnd
+                       } // for j                                      
+
+                       if (okEraseElement==0) 
+                       { 
+                               Filenames.erase( Filenames.begin()+i );
+                       }
+               } // for i      
+       } // if FileEnd !=0
+
+       sizeFilenames = Filenames.size();
 
 // Cleanning paths with spaces 
        for (i=0; i<sizeFilenames; i++)
        {
                tmpString=Filenames[i];
+
                std::string::size_type  spacePosition = tmpString.find_first_of(' ');
                if (spacePosition != std::string::npos)
                {
@@ -283,6 +330,7 @@ void FilesFromDirectory::CleanFilenames( std::string basePath )
                } // if spacePosition
        }
 
+
 // Alphabetical order  
        for (i=0; i<sizeFilenames; i++)
        {