]> 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 698cca545686326c20eb0a42da98a1009d3d8270..7560fd896335b377d8a6803593fc3d2304aee2a9 100644 (file)
@@ -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 <string>
 
 #ifdef _MSC_VER
    #include <windows.h>
@@ -19,27 +47,30 @@ 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::bbUserSetDefaultValues()
 {
-
     bbSetInputIn(".");
-    bbSetInputRecursive(false);
-  
+    bbSetInputRecursive(false);  
+    bbSetInputType(0);  
+}
+
+void FilesFromDirectory::bbUserInitializeProcessing() 
+{ 
+}
+
+void FilesFromDirectory::bbUserFinalizeProcessing() 
+{
 }
-  void FilesFromDirectory::bbUserInitializeProcessing() 
-  { 
-  }
-  void FilesFromDirectory::bbUserFinalizeProcessing() 
-  {
-  }
   
 /**
  * \brief   Add a SEPARATOR to the end of the name if necessary
@@ -69,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 : [" <<temp << 
+              "] contains space(s); Discarted !" << std::endl;
+               temp.insert(spacePosition, "\\");
+                       continue;  /// \TODO : fix the trouble (vtk?)
+               } // if !npos
+*/
+
+
+               if (bbGetInputType()==0)
+               {
+                       Filenames.push_back(temp);       
+                       numberOfFiles++;
+               } // Type files
+
+      } // if !directory
+       } // for
+       DWORD dwError = GetLastError();
+       if (hFile != INVALID_HANDLE_VALUE) 
+       {
+               FindClose(hFile);
+       }// 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 : "<<dirName);
+      return -1;
+       } // dwError
+
+#else
+  // Real POSIX implementation: scandir is a BSD extension only, and doesn't 
+  // work on debian for example
+
+       DIR* dir = opendir( dirName.c_str() );
+       if (!dir)
+       {
+               return 0;
+       }
+
+   // According to POSIX, the dirent structure contains a field char d_name[]
+   // of unspecified size, with at most NAME_MAX characters preceeding the
+   // terminating null character. Use of other fields will harm the  porta-
+   // bility of your programs.
+
+       struct stat     buf;
+       dirent                  *d;
+       for (d = readdir(dir); d; d = readdir(dir))
+       {
+       fileName = dirName + d->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 : [" <<temp << 
+                               "] contains space(s); Discarted !" << std::endl;
+                       temp.insert(spacePosition, "\\");
+                                       continue;   /// \TODO : fix the trouble (vtk?)
+               } // if spacePosition
+*/
+
+                               if (bbGetInputType()==0)
+                               {
+                       Filenames.push_back(temp);       
+                               numberOfFiles++;
+                               } // Type files
+               } // d_name
+       } else if ( S_ISDIR(buf.st_mode) ) {  //directory?
+               if ( (d->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; 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)
+               {
+                       std::cout << "=========================================== File name : [" <<tmpString << 
+               "] contains space(s); Discarted !" << std::endl;
+                       tmpString.insert(spacePosition, "\\");
+                       Filenames[i]=tmpString;
+//                     continue;   /// \TODO : fix the trouble (vtk?)
+               } // if spacePosition
+       }
+
+
+// Alphabetical order  
+       for (i=0; i<sizeFilenames; i++)
+       {
+       for (ii=i; ii<sizeFilenames; ii++)
+               {
+                       if (Filenames[i]>Filenames[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; i<sizeFilenames; i++)
+       {
+               SimpleFilenames.push_back( Filenames[i].substr( lenghtBasePath ) );
+       } // for i
+
+}
+
+
+
+
+/*
+
+int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
+{
+   Filenames.clear();
    int numberOfFiles = 0;
    std::string fileName;
    std::string dirName = NormalizePath(dirpath);
@@ -88,12 +379,22 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
          // Need to check for . and .. to avoid infinite loop
          if ( fileName != "." && fileName != ".." && recursive )
          {
-            numberOfFiles += Explore(dirName+fileName,recursive);
+            numberOfFiles += Explore(dirName+fileName, recursive);
          }
       }
       else
       {
-         Filenames.push_back(dirName+fileName);
+//         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 : [" <<temp << 
+              "] contains space(s); Discarted !" << std::endl;
+           temp.insert(spacePosition, "\\");
+   continue;  /// \TODO : fix the trouble (vtk?)
+        }      
+         Filenames.push_back(temp);
          numberOfFiles++;
       }
    }
@@ -135,17 +436,27 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
    for (d = readdir(dir); d; d = readdir(dir))
    {
       fileName = dirName + d->d_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?
       {
-                 if ( d->d_name[0]!='.')
-                 {     
-              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 : [" <<temp << 
+              "] contains space(s); Discarted !" << std::endl;
+                 temp.insert(spacePosition, "\\");
+   continue;   /// \TODO : fix the trouble (vtk?)
+             }
+             Filenames.push_back(temp);         
+             numberOfFiles++;
+         }
       }
       else if ( S_ISDIR(buf.st_mode) ) //directory?
       {
@@ -166,9 +477,24 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
    }
 #endif
 
+  std::string tmpString;
+  int i,ii,sizeFilenames = Filenames.size();
+  for (i=0; i<sizeFilenames; i++)
+  {
+    for (ii=i; ii<sizeFilenames; ii++)
+    {
+       if (Filenames[i]>Filenames[ii]) 
+        {
+          tmpString=Filenames[i];
+          Filenames[i]=Filenames[ii];
+          Filenames[ii]=tmpString;
+        } // if 
+    } // for ii
+  } // for i
+
   return numberOfFiles;
 }
-
+*/
 
 }
 // EO namespace bbstd