]> Creatis software - bbtk.git/blobdiff - packages/std/src/bbstdFilesFromDirectory.cxx
#2853 BBTK Feature New Normal - std:FilesFromDirectory box add option to create...
[bbtk.git] / packages / std / src / bbstdFilesFromDirectory.cxx
index fc271c23591dd14977a420714323bd855561b9d4..1aefdb16e4005719a68219f62bb9b1cf6b79fb1e 100644 (file)
@@ -47,19 +47,20 @@ BBTK_BLACK_BOX_IMPLEMENTATION(FilesFromDirectory,bbtk::AtomicBlackBox);
 
 void FilesFromDirectory::Process()
 {
-   DirName = bbGetInputIn();
-   bool rec = bbGetInputRecursive();
-   /*int nbFiles = */ Explore(DirName, rec);
-   bbSetOutputOut(Filenames);   
-   
-//  for (int i=0; i<Filenames.size(); i++)
-//     std::cout << "Filenames [" << i << "] = [" << Filenames[i] << "]" << std::endl;  
+       Filenames.clear();
+       DirName         = bbGetInputIn();
+       bool rec        = bbGetInputRecursive();
+       /*int nbFiles = */ Explore(DirName, rec);
+       CleanFilenames( bbGetInputIn() );
+       bbSetOutputOut(Filenames);   
+       bbSetOutputOutSimple(SimpleFilenames);   
 }
 
 void FilesFromDirectory::bbUserSetDefaultValues()
 {
     bbSetInputIn(".");
     bbSetInputRecursive(false);  
+    bbSetInputType(0);  
 }
 
 void FilesFromDirectory::bbUserInitializeProcessing() 
@@ -98,6 +99,218 @@ 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)
+                       {
+                               Filenames.push_back(fileName);   
+                               numberOfFiles++;
+                       } // Type ALL_directories
+
+                       tmpNumberOfFiles        =       Explore(dirName+fileName, recursive);
+                       if ((bbGetInputType()==2)&&tmpNumberOfFiles==0)
+                       {
+                       Filenames.push_back(fileName);   
+                       numberOfFiles++;
+                       } // Type Lsast_directories
+                       
+                       numberOfFiles           =       numberOfFiles + tmpNumberOfFiles;
+         } // if
+      } 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
+               } 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();
+
+// 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();
@@ -185,7 +398,7 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
          if ( d->d_name[0]!='.')
          {
         
-             std::string::size_type /* long int */ spacePosition = temp.find_first_of(' ');
+             std::string::size_type  spacePosition = temp.find_first_of(' ');
              if (spacePosition != std::string::npos)
             {
    std::cout << "=========================================== File name : [" <<temp << 
@@ -233,7 +446,7 @@ int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
 
   return numberOfFiles;
 }
-
+*/
 
 }
 // EO namespace bbstd