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