]> Creatis software - bbtk.git/blob - packages/std/src/bbstdFilesFromDirectory.cxx
*** MAJOR CHANGE *** NOT WORKING YET !!!
[bbtk.git] / packages / std / src / bbstdFilesFromDirectory.cxx
1 #include "bbstdFilesFromDirectory.h"
2 #include "bbstdPackage.h"
3
4 #ifdef _MSC_VER
5    #include <windows.h>
6    #include <direct.h>
7 #else
8    #include <dirent.h>   
9    #include <sys/types.h>
10 #endif
11
12 #include <sys/stat.h>  //stat function
13
14 namespace bbstd
15 {
16
17 BBTK_ADD_BLACK_BOX_TO_PACKAGE(std,FilesFromDirectory)
18 BBTK_BLACK_BOX_IMPLEMENTATION(FilesFromDirectory,bbtk::AtomicBlackBox);
19
20 void FilesFromDirectory::Process()
21 {
22
23    DirName = bbGetInputIn();
24    bool rec = bbGetInputRecursive();
25    /*int nbFiles = */ Explore(DirName, rec);
26    bbSetOutputOut(Filenames);
27    
28   
29 }
30 void FilesFromDirectory::bbUserSetDefaultValues()
31 {
32
33     bbSetInputIn(".");
34     bbSetInputRecursive(false);
35   
36 }
37   void FilesFromDirectory::bbUserInitializeProcessing() 
38   { 
39   }
40   void FilesFromDirectory::bbUserFinalizeProcessing() 
41   {
42   }
43   
44 /**
45  * \brief   Add a SEPARATOR to the end of the name if necessary
46  * @param   pathname file/directory name to normalize 
47  */
48 std::string FilesFromDirectory::NormalizePath(std::string const &pathname)
49 {
50 #ifdef _WIN32
51    const char FILESEPARATOR = '\\';
52 #else
53    const char FILESEPARATOR = '/';
54 #endif
55
56    std::string name = pathname;
57    int size = name.size();
58
59    if ( name[size-1] != FILESEPARATOR )
60    {
61       name += FILESEPARATOR;
62    }
63    return name;
64
65
66 /**
67  * \brief   Explores a directory with possibility of recursion
68  *          return number of files read
69  * @param  dirpath   directory to explore
70  * @param  recursive whether we want recursion or not
71  */
72 int FilesFromDirectory::Explore(std::string const &dirpath, bool recursive)
73 {
74    int numberOfFiles = 0;
75    std::string fileName;
76    std::string dirName = NormalizePath(dirpath);
77 #ifdef _MSC_VER
78    WIN32_FIND_DATA fileData;
79    //assert( dirName[dirName.size()-1] == '' );
80    HANDLE hFile = FindFirstFile((dirName+"*").c_str(), &fileData);
81
82    for(BOOL b = (hFile != INVALID_HANDLE_VALUE); b;
83        b = FindNextFile(hFile, &fileData))
84    {
85       fileName = fileData.cFileName;
86       if ( fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
87       {
88          // Need to check for . and .. to avoid infinite loop
89          if ( fileName != "." && fileName != ".." && recursive )
90          {
91             numberOfFiles += Explore(dirName+fileName,recursive);
92          }
93       }
94       else
95       {
96          Filenames.push_back(dirName+fileName);
97          numberOfFiles++;
98       }
99    }
100    DWORD dwError = GetLastError();
101    if (hFile != INVALID_HANDLE_VALUE) 
102       FindClose(hFile);
103    if (dwError != ERROR_NO_MORE_FILES) 
104    {
105       LPVOID lpMsgBuf;
106       FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
107                     FORMAT_MESSAGE_FROM_SYSTEM|
108                     FORMAT_MESSAGE_IGNORE_INSERTS,
109                     NULL,GetLastError(),
110                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
111                     (LPTSTR) &lpMsgBuf,0,NULL);
112
113       //gdcmErrorMacro("FindNextFile error. Error is " << (char *)lpMsgBuf
114       //             <<" for the directory : "<<dirName);
115       return -1;
116    }
117
118 #else
119   // Real POSIX implementation: scandir is a BSD extension only, and doesn't 
120   // work on debian for example
121
122    DIR* dir = opendir(dirName.c_str());
123    if (!dir)
124    {
125       return 0;
126    }
127
128    // According to POSIX, the dirent structure contains a field char d_name[]
129    // of unspecified size, with at most NAME_MAX characters preceeding the
130    // terminating null character. Use of other fields will harm the  porta-
131    // bility of your programs.
132
133    struct stat buf;
134    dirent *d;
135    for (d = readdir(dir); d; d = readdir(dir))
136    {
137       fileName = dirName + d->d_name;
138       if( stat(fileName.c_str(), &buf) != 0 )
139       {
140          //gdcmErrorMacro( strerror(errno) );
141       }
142       if ( S_ISREG(buf.st_mode) )    //is it a regular file?
143       {
144                   if ( d->d_name[0]!='.')
145                   {     
146               Filenames.push_back( fileName );
147               numberOfFiles++;
148                   }
149       }
150       else if ( S_ISDIR(buf.st_mode) ) //directory?
151       {
152          if ( d->d_name[0] != '.' && recursive ) //we also skip hidden files
153          {
154             numberOfFiles += Explore( fileName, recursive);
155          }
156       }
157       else
158       {
159          //gdcmErrorMacro( "Unexpected error" );
160          return -1;
161       }
162    }
163    if( closedir(dir) != 0 )
164    {
165       //gdcmErrorMacro( strerror(errno) );
166    }
167 #endif
168
169   return numberOfFiles;
170 }
171
172
173 }
174 // EO namespace bbstd
175
176