]>
Commit | Line | Data |
---|---|---|
23324ae1 FM |
1 | ///////////////////////////////////////////////////////////////////////////// |
2 | // Name: dir.h | |
e54c96f1 | 3 | // Purpose: interface of wxDirTraverser |
23324ae1 FM |
4 | // Author: wxWidgets team |
5 | // RCS-ID: $Id$ | |
6 | // Licence: wxWindows license | |
7 | ///////////////////////////////////////////////////////////////////////////// | |
8 | ||
9 | /** | |
10 | @class wxDirTraverser | |
11 | @wxheader{dir.h} | |
7c913512 | 12 | |
23324ae1 FM |
13 | wxDirTraverser is an abstract interface which must be implemented by objects |
14 | passed to wxDir::Traverse function. | |
7c913512 | 15 | |
23324ae1 | 16 | Example of use (this works almost like wxDir::GetAllFiles): |
7c913512 | 17 | |
23324ae1 FM |
18 | @code |
19 | class wxDirTraverserSimple : public wxDirTraverser | |
20 | { | |
21 | public: | |
22 | wxDirTraverserSimple(wxArrayString& files) : m_files(files) { } | |
7c913512 | 23 | |
23324ae1 FM |
24 | virtual wxDirTraverseResult OnFile(const wxString& filename) |
25 | { | |
26 | m_files.Add(filename); | |
27 | return wxDIR_CONTINUE; | |
28 | } | |
7c913512 | 29 | |
23324ae1 FM |
30 | virtual wxDirTraverseResult OnDir(const wxString& WXUNUSED(dirname)) |
31 | { | |
32 | return wxDIR_CONTINUE; | |
33 | } | |
7c913512 | 34 | |
23324ae1 FM |
35 | private: |
36 | wxArrayString& m_files; | |
37 | }; | |
7c913512 | 38 | |
23324ae1 FM |
39 | // get the names of all files in the array |
40 | wxArrayString files; | |
41 | wxDirTraverserSimple traverser(files); | |
7c913512 | 42 | |
23324ae1 FM |
43 | wxDir dir(dirname); |
44 | dir.Traverse(traverser); | |
45 | @endcode | |
7c913512 | 46 | |
23324ae1 FM |
47 | @library{wxbase} |
48 | @category{file} | |
49 | */ | |
7c913512 | 50 | class wxDirTraverser |
23324ae1 FM |
51 | { |
52 | public: | |
53 | /** | |
7c913512 | 54 | This function is called for each directory. It may return @c wxSIR_STOP |
23324ae1 FM |
55 | to abort traversing completely, @c wxDIR_IGNORE to skip this directory but |
56 | continue with others or @c wxDIR_CONTINUE to enumerate all files and | |
57 | subdirectories in this directory. | |
23324ae1 FM |
58 | This is a pure virtual function and must be implemented in the derived class. |
59 | */ | |
60 | virtual wxDirTraverseResult OnDir(const wxString& dirname); | |
61 | ||
62 | /** | |
63 | This function is called for each file. It may return @c wxDIR_STOP to abort | |
7c913512 | 64 | traversing (for example, if the file being searched is found) or |
23324ae1 | 65 | @c wxDIR_CONTINUE to proceed. |
23324ae1 FM |
66 | This is a pure virtual function and must be implemented in the derived class. |
67 | */ | |
68 | virtual wxDirTraverseResult OnFile(const wxString& filename); | |
69 | ||
70 | /** | |
71 | This function is called for each directory which we failed to open for | |
72 | enumerating. It may return @c wxSIR_STOP to abort traversing completely, | |
7c913512 | 73 | @c wxDIR_IGNORE to skip this directory but continue with others or |
23324ae1 | 74 | @c wxDIR_CONTINUE to retry opening this directory once again. |
23324ae1 FM |
75 | The base class version always returns @c wxDIR_IGNORE. |
76 | */ | |
77 | virtual wxDirTraverseResult OnOpenError(const wxString& openerrorname); | |
78 | }; | |
79 | ||
80 | ||
e54c96f1 | 81 | |
23324ae1 FM |
82 | /** |
83 | @class wxDir | |
84 | @wxheader{dir.h} | |
7c913512 | 85 | |
23324ae1 FM |
86 | wxDir is a portable equivalent of Unix open/read/closedir functions which |
87 | allow enumerating of the files in a directory. wxDir allows to enumerate files | |
88 | as well as directories. | |
7c913512 FM |
89 | |
90 | wxDir also provides a flexible way to enumerate files recursively using | |
91 | wxDir::Traverse or a simpler | |
23324ae1 | 92 | wxDir::GetAllFiles function. |
7c913512 | 93 | |
23324ae1 | 94 | Example of use: |
7c913512 | 95 | |
23324ae1 FM |
96 | @code |
97 | wxDir dir(wxGetCwd()); | |
7c913512 | 98 | |
23324ae1 FM |
99 | if ( !dir.IsOpened() ) |
100 | { | |
101 | // deal with the error here - wxDir would already log an error message | |
102 | // explaining the exact reason of the failure | |
103 | return; | |
104 | } | |
7c913512 | 105 | |
23324ae1 | 106 | puts("Enumerating object files in current directory:"); |
7c913512 | 107 | |
23324ae1 | 108 | wxString filename; |
7c913512 | 109 | |
23324ae1 FM |
110 | bool cont = dir.GetFirst(, filespec, flags); |
111 | while ( cont ) | |
112 | { | |
113 | printf("%s\n", filename.c_str()); | |
7c913512 | 114 | |
23324ae1 FM |
115 | cont = dir.GetNext(); |
116 | } | |
117 | @endcode | |
7c913512 | 118 | |
23324ae1 FM |
119 | @library{wxbase} |
120 | @category{file} | |
121 | */ | |
7c913512 | 122 | class wxDir |
23324ae1 FM |
123 | { |
124 | public: | |
125 | //@{ | |
126 | /** | |
7c913512 | 127 | Opens the directory for enumeration, use IsOpened() |
23324ae1 FM |
128 | to test for errors. |
129 | */ | |
130 | wxDir(); | |
7c913512 | 131 | wxDir(const wxString& dir); |
23324ae1 FM |
132 | //@} |
133 | ||
134 | /** | |
135 | Destructor cleans up the associated resources. It is not virtual and so this | |
136 | class is not meant to be used polymorphically. | |
137 | */ | |
138 | ~wxDir(); | |
139 | ||
140 | /** | |
141 | Test for existence of a directory with the given name | |
142 | */ | |
143 | static bool Exists(const wxString& dir); | |
144 | ||
145 | /** | |
146 | The function returns the path of the first file matching the given @e filespec | |
147 | or an empty string if there are no files matching it. | |
4cc4bfaf FM |
148 | The @a flags parameter may or may not include @c wxDIR_FILES, the |
149 | function always behaves as if it were specified. By default, @a flags | |
23324ae1 FM |
150 | includes @c wxDIR_DIRS and so the function recurses into the subdirectories |
151 | but if this flag is not specified, the function restricts the search only to | |
4cc4bfaf | 152 | the directory @a dirname itself. |
23324ae1 FM |
153 | See also: Traverse() |
154 | */ | |
155 | static wxString FindFirst(const wxString& dirname, | |
156 | const wxString& filespec, | |
157 | int flags = wxDIR_DEFAULT); | |
158 | ||
159 | /** | |
4cc4bfaf FM |
160 | The function appends the names of all the files under directory @a dirname |
161 | to the array @a files (note that its old content is preserved). Only files | |
162 | matching the @a filespec are taken, with empty spec matching all the files. | |
163 | The @a flags parameter should always include @c wxDIR_FILES or the array | |
23324ae1 FM |
164 | would be unchanged and should include @c wxDIR_DIRS flag to recurse into |
165 | subdirectories (both flags are included in the value by default). | |
23324ae1 FM |
166 | See also: Traverse() |
167 | */ | |
168 | static size_t GetAllFiles(const wxString& dirname, | |
4cc4bfaf | 169 | wxArrayString* files, |
23324ae1 FM |
170 | const wxString& filespec = wxEmptyString, |
171 | int flags = wxDIR_DEFAULT); | |
172 | ||
173 | /** | |
4cc4bfaf | 174 | Start enumerating all files matching @a filespec (or all files if it is |
23324ae1 FM |
175 | empty) and @e flags, return @true on success. |
176 | */ | |
177 | bool GetFirst(wxString* filename, | |
178 | const wxString& filespec = wxEmptyString, | |
328f5751 | 179 | int flags = wxDIR_DEFAULT) const; |
23324ae1 FM |
180 | |
181 | /** | |
182 | Returns the name of the directory itself. The returned string does not have the | |
183 | trailing path separator (slash or backslash). | |
184 | */ | |
328f5751 | 185 | wxString GetName() const; |
23324ae1 FM |
186 | |
187 | /** | |
188 | Continue enumerating files which satisfy the criteria specified by the last | |
189 | call to GetFirst(). | |
190 | */ | |
328f5751 | 191 | bool GetNext(wxString* filename) const; |
23324ae1 FM |
192 | |
193 | /** | |
194 | Returns the size (in bytes) of all files recursively found in @c dir or | |
195 | @c wxInvalidSize in case of error. | |
23324ae1 FM |
196 | In case it happens that while traversing folders a file's size can not be read, |
197 | that file is added to the @c filesSkipped array, if not @NULL, and then | |
198 | skipped. | |
199 | This usually happens with some special folders which are locked by the | |
200 | operating system | |
201 | or by another process. Remember that when @c filesSkipped-GetCount() is not | |
202 | zero, | |
203 | then the returned value is not 100% accurate and, if the skipped files were | |
204 | big, it could be | |
205 | far from real size of the directory. | |
23324ae1 | 206 | See also: wxFileName::GetHumanReadableSize, |
e54c96f1 | 207 | wxGetDiskSpace() |
23324ae1 FM |
208 | */ |
209 | static wxULongLong GetTotalSize(const wxString& dir, | |
4cc4bfaf | 210 | wxArrayString* filesSkipped = NULL); |
23324ae1 FM |
211 | |
212 | /** | |
7c913512 | 213 | Returns @true if the directory contains any files matching the given |
4cc4bfaf | 214 | @e filespec. If @a filespec is empty, look for any files at all. In any |
23324ae1 FM |
215 | case, even hidden files are taken into account. |
216 | */ | |
217 | bool HasFiles(const wxString& filespec = wxEmptyString); | |
218 | ||
219 | /** | |
220 | Returns @true if the directory contains any subdirectories (if a non | |
221 | empty @e filespec is given, only check for directories matching it). | |
222 | The hidden subdirectories are taken into account as well. | |
223 | */ | |
224 | bool HasSubDirs(const wxString& dirspec = wxEmptyString); | |
225 | ||
226 | /** | |
7c913512 | 227 | Returns @true if the directory was successfully opened by a previous call to |
23324ae1 FM |
228 | Open(). |
229 | */ | |
328f5751 | 230 | bool IsOpened() const; |
23324ae1 FM |
231 | |
232 | /** | |
233 | Open the directory for enumerating, returns @true on success | |
234 | or @false if an error occurred. | |
235 | */ | |
236 | bool Open(const wxString& dir); | |
237 | ||
238 | /** | |
239 | Enumerate all files and directories under the given directory recursively | |
7c913512 | 240 | calling the element of the provided wxDirTraverser |
23324ae1 | 241 | object for each of them. |
7c913512 | 242 | More precisely, the function will really recurse into subdirectories if |
4cc4bfaf | 243 | @a flags contains @c wxDIR_DIRS flag. It will ignore the files (but |
23324ae1 FM |
244 | still possibly recurse into subdirectories) if @c wxDIR_FILES flag is |
245 | given. | |
23324ae1 FM |
246 | For each found directory, @ref wxDirTraverser::ondir sink.OnDir is called |
247 | and @ref wxDirTraverser::onfile sink.OnFile is called for every file. | |
248 | Depending on the return value, the enumeration may continue or stop. | |
23324ae1 FM |
249 | The function returns the total number of files found or @c (size_t)-1 on |
250 | error. | |
23324ae1 FM |
251 | See also: GetAllFiles() |
252 | */ | |
253 | size_t Traverse(wxDirTraverser& sink, | |
254 | const wxString& filespec = wxEmptyString, | |
255 | int flags = wxDIR_DEFAULT); | |
256 | }; | |
e54c96f1 | 257 |