]> git.saurik.com Git - wxWidgets.git/blob - src/common/filename.cpp
Added wxFileName.
[wxWidgets.git] / src / common / filename.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: filename.cpp
3 // Purpose: wxFileName - encapsulates candy
4 // Author: Robert Roebling
5 // Modified by:
6 // Created: 28.12.2000
7 // RCS-ID: $Id$
8 // Copyright: (c) 2000 Robert Roebling
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "filename.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #ifndef WX_PRECOMP
24 #include "wx/intl.h"
25 #include "wx/log.h"
26 #endif
27
28 #include "wx/filename.h"
29 #include "wx/tokenzr.h"
30 #include "wx/filefn.h"
31
32 //----------------------------------------------------------------------------
33 // wxFileName
34 //----------------------------------------------------------------------------
35
36 wxFileName::wxFileName( const wxFileName &filename )
37 {
38 m_ext = filename.GetExt();
39 m_name = filename.GetName();
40 const wxArrayString &dirs = filename.GetDirs();
41 for (size_t i = 0; i < dirs.GetCount(); i++)
42 {
43 m_dirs.Add( dirs[i] );
44 }
45 }
46
47 void wxFileName::Assign( const wxString &path, bool dir_only, wxPathFormat format )
48 {
49 m_ext = wxEmptyString;
50 m_name = wxEmptyString;
51 m_dirs.Clear();
52
53 format = GetFormat( format );
54
55 wxString seps;
56 if (format == wxPATH_DOS)
57 {
58 seps = "/\\";
59 }
60 else
61 if (format == wxPATH_UNIX)
62 {
63 seps = "/";
64 }
65 else
66 {
67 seps = "/"; // or maybe ":" or both ?
68 }
69
70 wxStringTokenizer tn( path, seps );
71 while (tn.HasMoreTokens())
72 {
73 wxString token( tn.GetNextToken() );
74 if (!token.IsEmpty())
75 m_dirs.Add( token );
76 }
77
78 if (!dir_only)
79 {
80 // make last m_dir -> m_name
81 size_t last = m_dirs.GetCount();
82 if (last == 0) return;
83 last--;
84 m_name = m_dirs[last];
85 m_dirs.Remove( last );
86
87 if (m_name == wxT(".")) return;
88 if (m_name == wxT("..")) return;
89
90 // ext?
91 int pos = m_name.Find( wxT('.') );
92 if (pos == -1) return;
93
94 bool has_starting_dot = (pos == 0);
95 if (has_starting_dot)
96 {
97 // remove dot
98 m_name.Remove(0,1);
99
100 // search again
101 pos = m_name.Find( wxT('.') );
102 if (pos == -1)
103 {
104 // add dot back
105 m_name.Prepend( "." );
106 return;
107 }
108 }
109 m_ext = m_name;
110 m_ext.Remove( 0, pos+1 );
111
112 m_name.Remove( pos, m_name.Len()-pos );
113
114 if (has_starting_dot)
115 {
116 // add dot back
117 m_name.Prepend( "." );
118 return;
119 }
120 }
121 }
122
123 bool wxFileName::FileExists()
124 {
125 return ::wxFileExists( GetFullPath() );
126 }
127
128 bool wxFileName::DirExists()
129 {
130 return ::wxDirExists( GetFullPath() );
131 }
132
133 void wxFileName::AssignCwd()
134 {
135 Assign( wxGetCwd(), TRUE );
136 }
137
138 void wxFileName::SetCwd()
139 {
140 wxSetWorkingDirectory( GetFullPath() );
141 }
142
143 void wxFileName::AssignTempFileName( const wxString &prefix )
144 {
145 }
146
147 void wxFileName::Mkdir( int perm )
148 {
149 wxMkdir( GetFullPath(), perm );
150 }
151
152 void wxFileName::Rmdir()
153 {
154 wxRmdir( GetFullPath() );
155 }
156
157 void wxFileName::MakeAbsolute()
158 {
159 }
160
161 bool wxFileName::SameAs( const wxFileName &filename, bool upper_on_dos )
162 {
163 wxString file1( GetFullPath() );
164 wxString file2( filename.GetFullPath() );
165
166 #ifdef __WXMSW__
167 if (upper_on_dos)
168 {
169 file1.MakeUpper();
170 file2.MakeUpper();
171 }
172 #endif
173
174 return (file1 == file2);
175 }
176
177 bool wxFileName::IsCaseSensitive( wxPathFormat format )
178 {
179 format = GetFormat( format );
180
181 return (format != wxPATH_DOS);
182 }
183
184 bool wxFileName::IsRelative( wxPathFormat format )
185 {
186 format = GetFormat( format );
187
188 for (size_t i = 0; i < m_dirs.GetCount(); i++)
189 {
190 if ((format == wxPATH_UNIX) && (i == 0) && (m_dirs[0] == wxT("~"))) return TRUE;
191
192 if (m_dirs[i] == wxT(".")) return TRUE;
193 if (m_dirs[i] == wxT("..")) return TRUE;
194 }
195
196 return FALSE;
197 }
198
199 bool wxFileName::IsAbsolute( wxPathFormat format )
200 {
201 return (!IsRelative(format));
202 }
203
204 bool wxFileName::IsWild( wxPathFormat format )
205 {
206 format = GetFormat( format );
207
208 if (format == wxPATH_DOS)
209 {
210 if (m_name.Find( wxT('*') ) != -1) return TRUE;
211 if (m_name.Find( wxT('?') ) != -1) return TRUE;
212 }
213 else
214 {
215 if (m_name.Find( wxT('*') ) != -1) return TRUE;
216 }
217
218 return FALSE;
219 }
220
221 void wxFileName::AppendDir( const wxString &dir )
222 {
223 m_dirs.Add( dir );
224 }
225
226 void wxFileName::PrependDir( const wxString &dir )
227 {
228 m_dirs.Insert( dir, 0 );
229 }
230
231 void wxFileName::InsertDir( int before, const wxString &dir )
232 {
233 m_dirs.Insert( dir, before );
234 }
235
236 void wxFileName::RemoveDir( int pos )
237 {
238 m_dirs.Remove( (size_t)pos );
239 }
240
241 wxString wxFileName::GetPath( wxPathFormat format ) const
242 {
243 format = GetFormat( format );
244
245 wxString ret;
246 if (format == wxPATH_DOS)
247 {
248 for (size_t i = 0; i < m_dirs.GetCount(); i++)
249 {
250 ret += m_dirs[i];
251 if (i != m_dirs.GetCount()-1) ret += '\\';
252 }
253 }
254 else
255 if (format == wxPATH_DOS)
256 {
257 for (size_t i = 0; i < m_dirs.GetCount(); i++)
258 {
259 ret += m_dirs[i];
260 if (i != m_dirs.GetCount()-1) ret += '/';
261 }
262 }
263 else
264 {
265 for (size_t i = 0; i < m_dirs.GetCount(); i++)
266 {
267 ret += m_dirs[i];
268 if (i != m_dirs.GetCount()-1) ret += "//"; // or maybe ":" ?
269 }
270 }
271
272 return ret;
273 }
274
275 wxString wxFileName::GetFullPath( wxPathFormat format ) const
276 {
277 format = GetFormat( format );
278
279 wxString ret;
280 if (format == wxPATH_DOS)
281 {
282 for (size_t i = 0; i < m_dirs.GetCount(); i++)
283 {
284 ret += m_dirs[i];
285 ret += '\\';
286 }
287 }
288 else
289 if (format == wxPATH_DOS)
290 {
291 for (size_t i = 0; i < m_dirs.GetCount(); i++)
292 {
293 ret += m_dirs[i];
294 ret += '/';
295 }
296 }
297 else
298 {
299 for (size_t i = 0; i < m_dirs.GetCount(); i++)
300 {
301 ret += m_dirs[i];
302 ret += '/'; // or maybe ":" ?
303 }
304 }
305
306 ret += m_name;
307
308 if (!m_ext.IsEmpty())
309 {
310 ret += '.';
311 ret += m_ext;
312 }
313
314 return ret;
315 }
316
317 wxPathFormat wxFileName::GetFormat( wxPathFormat format )
318 {
319 if (format == wxPATH_NATIVE)
320 {
321 #if defined(__WXMSW__) || defined(__WXPM__)
322 format = wxPATH_DOS;
323 #endif
324 #if defined(__WXMAC__)
325 format = wxPATH_MAC;
326 #endif
327 #if !defined(__WXMSW__) && !defined(__WXPM__) && !defined(__WXMAC__)
328 format = wxPATH_UNIX;
329 #endif
330 }
331 return format;
332 }