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();
+ SimpleFilenames.clear();
+
+ if (bbGetInputActive()==true)
+ {
+ if (bbGetInputIn()!="")
+ {
+ DirName = bbGetInputIn();
+ /*int nbFiles = */ Explore(DirName, bbGetInputRecursive(), bbGetInputRecursiveLevel() );
+ CleanFilenames( DirName );
+ } // if In
+ } // Active
+ bbSetOutputOut(Filenames);
+ bbSetOutputOutSimple(SimpleFilenames);
}
void FilesFromDirectory::bbUserSetDefaultValues()
{
+ bbSetInputActive(true);
bbSetInputIn(".");
bbSetInputRecursive(false);
+ bbSetInputType(0);
+ bbSetInputRecursiveLevel(999);
}
void FilesFromDirectory::bbUserInitializeProcessing()
std::string name = pathname;
int size = name.size();
- if ( name[size-1] != FILESEPARATOR )
+ if (!((name[size-1]=='/')||(name[size-1]=='\\')))
{
name += FILESEPARATOR;
}
* @param dirpath directory to explore
* @param recursive whether we want recursion or not
*/
+
+
+
+int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive, int recursiveLevel)
+{
+ int numberOfFiles = 0;
+
+if (recursiveLevel>=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,recursiveLevel-1);
+ 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, recursiveLevel-1);
+ 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
+
+} // if recursiveLevel
+
+ return numberOfFiles;
+}
+
+
+//------------------------------------------------------------------------------
+void FilesFromDirectory::CleanFilenames( std::string basePath )
+{
+ std::string tmpString;
+ int i,ii,sizeFilenames = Filenames.size();
+ int j,sizeFileEnd = bbGetInputFileEnd().size();
+ int okEraseElement;
+ int posStr;
+//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++)
+ {
+ posStr=(Filenames[i].length()) - (bbGetInputFileEnd()[j]).length();
+ if (posStr>=0)
+ {
+ std::string tmp=Filenames[i].substr( posStr ) ;
+ if (bbGetInputFileEnd()[j].compare( tmp )==0 )
+ {
+ okEraseElement++;
+ } // if FileEnd
+ }// if posStr
+ } // 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);
}
else
{
- std::string temp = "\"" +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)
{
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 <<
}
#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