]> git.saurik.com Git - wxWidgets.git/blob - interface/wx/dir.h
reorder the classes, putting first the basic ones and towards the end of the file...
[wxWidgets.git] / interface / wx / dir.h
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
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
181 @see Traverse()
182 */
183 static wxString FindFirst(const wxString& dirname,
184 const wxString& filespec,
185 int flags = wxDIR_DEFAULT);
186
187 /**
188 The function appends the names of all the files under directory
189 @a dirname to the array @a files (note that its old content is
190 preserved). Only files matching the @a filespec are taken, with empty
191 spec matching all the files.
192
193 The @a flags parameter should always include ::wxDIR_FILES or the array
194 would be unchanged and should include ::wxDIR_DIRS flag to recurse into
195 subdirectories (both flags are included in the value by default).
196
197 @see Traverse()
198 */
199 static size_t GetAllFiles(const wxString& dirname, wxArrayString* files,
200 const wxString& filespec = wxEmptyString,
201 int flags = wxDIR_DEFAULT);
202
203 /**
204 Start enumerating all files matching @a filespec (or all files if it is
205 empty) and @e flags, return @true on success.
206 */
207 bool GetFirst(wxString* filename,
208 const wxString& filespec = wxEmptyString,
209 int flags = wxDIR_DEFAULT) const;
210
211 /**
212 Returns the name of the directory itself. The returned string does not
213 have the trailing path separator (slash or backslash).
214 */
215 wxString GetName() const;
216
217 /**
218 Continue enumerating files which satisfy the criteria specified by the
219 last call to GetFirst().
220 */
221 bool GetNext(wxString* filename) const;
222
223 /**
224 Returns the size (in bytes) of all files recursively found in @c dir or
225 @c wxInvalidSize in case of error.
226
227 In case it happens that while traversing folders a file's size can not
228 be read, that file is added to the @a filesSkipped array, if not @NULL,
229 and then skipped. This usually happens with some special folders which
230 are locked by the operating system or by another process. Remember that
231 when the size of @a filesSkipped is not zero, then the returned value
232 is not 100% accurate and, if the skipped files were big, it could be
233 far from real size of the directory.
234
235 @see wxFileName::GetHumanReadableSize(), wxGetDiskSpace()
236 */
237 static wxULongLong GetTotalSize(const wxString& dir,
238 wxArrayString* filesSkipped = NULL);
239
240 /**
241 Returns @true if the directory contains any files matching the given
242 @a filespec. If @a filespec is empty, look for any files at all. In any
243 case, even hidden files are taken into account.
244 */
245 bool HasFiles(const wxString& filespec = wxEmptyString) const;
246
247 /**
248 Returns @true if the directory contains any subdirectories (if a non
249 empty @a filespec is given, only check for directories matching it).
250 The hidden subdirectories are taken into account as well.
251 */
252 bool HasSubDirs(const wxString& dirspec = wxEmptyString) const;
253
254 /**
255 Returns @true if the directory was successfully opened by a previous
256 call to Open().
257 */
258 bool IsOpened() const;
259
260 /**
261 Open the directory for enumerating, returns @true on success or @false
262 if an error occurred.
263 */
264 bool Open(const wxString& dir);
265
266 /**
267 Enumerate all files and directories under the given directory
268 recursively calling the element of the provided wxDirTraverser object
269 for each of them.
270
271 More precisely, the function will really recurse into subdirectories if
272 @a flags contains ::wxDIR_DIRS flag. It will ignore the files (but
273 still possibly recurse into subdirectories) if ::wxDIR_FILES flag is
274 given.
275
276 For each found directory, @ref wxDirTraverser::OnDir() "sink.OnDir()"
277 is called and @ref wxDirTraverser::OnFile() "sink.OnFile()" is called
278 for every file. Depending on the return value, the enumeration may
279 continue or stop.
280
281 The function returns the total number of files found or @c "(size_t)-1"
282 on error.
283
284 @see GetAllFiles()
285 */
286 size_t Traverse(wxDirTraverser& sink,
287 const wxString& filespec = wxEmptyString,
288 int flags = wxDIR_DEFAULT) const;
289 };
290