]> Creatis software - gdcm.git/blob - src/gdcmDirList.cxx
* gdcmDirList : to parse a hard drive directory in recursive (or not)
[gdcm.git] / src / gdcmDirList.cxx
1 // gdcmDirList.cxx
2 //-----------------------------------------------------------------------------
3 #include "gdcmDirList.h"
4
5 #include <iostream>
6 #include <algorithm>
7
8 #ifdef GDCM_NO_ANSI_STRING_STREAM
9    #include <strstream>
10    #define  ostringstream ostrstream
11 #else
12    #include <sstream>
13 #endif
14
15 #ifdef _MSC_VER 
16    #include <windows.h> 
17    #include <direct.h>
18 #else
19    #include <dirent.h>   
20    #include <unistd.h>
21 #endif
22
23 //-----------------------------------------------------------------------------
24 const char gdcmDirList::SEPARATOR_X      = '/';
25 const char gdcmDirList::SEPARATOR_WIN    = '\\';
26 const std::string gdcmDirList::SEPARATOR = "/";
27
28 //-----------------------------------------------------------------------------
29 // Constructor / Destructor
30 /*
31  * \ingroup gdcmDirList
32  * \brief   
33  * @param   
34  */
35 gdcmDirList::gdcmDirList(std::string dirName,bool recursive)
36 {
37    name=dirName;
38
39    NormalizePath(name);
40    Explore(name,recursive);
41 }
42
43 /*
44  * \ingroup gdcmDirList
45  * \brief   
46  * @param   
47  */
48 gdcmDirList::~gdcmDirList(void)
49 {
50 }
51
52 //-----------------------------------------------------------------------------
53 // Print
54
55 //-----------------------------------------------------------------------------
56 // Public
57 /*
58  * \ingroup gdcmDirList
59  * \brief   Get the directory name
60  * @param   
61  */
62 std::string gdcmDirList::GetDirName(void)
63 {
64    return(name);
65 }
66
67 //-----------------------------------------------------------------------------
68 // Protected
69
70 //-----------------------------------------------------------------------------
71 // Private
72 /*
73  * \ingroup gdcmDirList
74  * \brief   Add a SEPARATOR to the end of the directory name is necessary
75  * @param   
76  */
77 void gdcmDirList::NormalizePath(std::string &dirName)
78 {
79    int size=dirName.size();
80    if((dirName[size-1]!=SEPARATOR_X)&&(dirName[size-1]!=SEPARATOR_WIN))
81    {
82       dirName+=SEPARATOR;
83    }
84 }
85
86 /*
87  * \ingroup gdcmDirList
88  * \brief   Explore a directory with possibility of recursion
89  * @param   
90  */
91 void gdcmDirList::Explore(std::string dirName,bool recursive)
92 {
93    std::string fileName;
94
95    NormalizePath(dirName);
96
97 #ifdef _MSC_VER 
98    WIN32_FIND_DATA fileData; 
99    HANDLE hFile=FindFirstFile((dirName+"*").c_str(),&fileData);
100    int found=true;
101
102    while( (hFile!=INVALID_HANDLE_VALUE) && (found) )
103    {
104       fileName=fileData.cFileName;
105       if(fileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
106       {
107          if( (fileName!=".") && (fileName!="..") && (recursive) )
108             Explore(dirName+fileName);
109       }
110       else
111       {
112          this->push_back(dirName+fileName);
113       }
114
115       found=FindNextFile(hFile,&fileData);
116    }
117
118 #else
119    struct dirent **namelist;
120    int n=scandir(dirName.c_str(), &namelist, 0, alphasort);
121
122    for (int i= 0;i < n; i++) 
123    {
124       fileName=namelist[i]->d_name;
125       if(namelist[i]->d_type==DT_DIR)
126       {
127          if( (fileName!=".") && (fileName!="..") && (recursive) )
128             Explore(dirName+fileName);
129       }
130       else
131       {
132          this->push_back(dirName+fileName);
133       }
134    }
135 #endif
136 }
137
138 //-----------------------------------------------------------------------------