1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/filefn.h
3// Purpose:     File- and directory-related functions
4// Author:      Julian Smart
5// Modified by:
6// Created:     29/01/98
7// RCS-ID:      $Id: filefn.h 63300 2010-01-28 21:36:09Z MW $
8// Copyright:   (c) 1998 Julian Smart
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef   _FILEFN_H_
13#define   _FILEFN_H_
14
15#include "wx/list.h"
16#include "wx/arrstr.h"
17
18#ifdef __WXWINCE__
19    #include "wx/msw/wince/time.h"
20    #include "wx/msw/private.h"
21#else
22    #include <time.h>
23#endif
24
25#ifdef __WXWINCE__
26// Nothing
27#elif !defined(__MWERKS__)
28    #include <sys/types.h>
29    #include <sys/stat.h>
30#else
31    #ifdef __MACH__
32        #include <sys/types.h>
33        #include <utime.h>
34        #include <sys/stat.h>
35        #include <unistd.h>
36    #else
37        #include <stat.h>
38        #include <unistd.h>
39        #include <unix.h>
40    #endif
41#endif
42
43#ifdef __OS2__
44// need to check for __OS2__ first since currently both
45// __OS2__ and __UNIX__ are defined.
46    #include <process.h>
47    #include "wx/os2/private.h"
48    #ifdef __WATCOMC__
49        #include <direct.h>
50    #endif
51    #include <io.h>
52    #ifdef __EMX__
53        #include <unistd.h>
54    #endif
55#elif defined(__UNIX__)
56    #include <unistd.h>
57    #include <dirent.h>
58#endif
59
60#if defined(__WINDOWS__) && !defined(__WXMICROWIN__)
61#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__) && !defined(__WXWINCE__) && !defined(__CYGWIN__)
62    #include <direct.h>
63    #include <dos.h>
64    #include <io.h>
65#endif // __WINDOWS__
66#endif // native Win compiler
67
68#if defined(__DOS__)
69    #ifdef __WATCOMC__
70        #include <direct.h>
71        #include <dos.h>
72        #include <io.h>
73    #endif
74    #ifdef __DJGPP__
75        #include <io.h>
76        #include <unistd.h>
77    #endif
78#endif
79
80#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs
81                    // this (3.1 I believe) and how to test for it.
82                    // If this works for Borland 4.0 as well, then no worries.
83    #include <dir.h>
84#endif
85
86#ifdef __SALFORDC__
87    #include <dir.h>
88    #include <unix.h>
89#endif
90
91#ifndef __WXWINCE__
92    #include  <fcntl.h>       // O_RDONLY &c
93#endif
94// ----------------------------------------------------------------------------
95// constants
96// ----------------------------------------------------------------------------
97
98#ifdef __WXWINCE__
99    typedef long off_t;
100#else
101    // define off_t
102    #if !defined(__WXMAC__) || defined(__UNIX__) || defined(__MACH__)
103        #include  <sys/types.h>
104    #else
105        typedef long off_t;
106    #endif
107#endif
108
109#if (defined(__VISUALC__) && !defined(__WXWINCE__)) || ( defined(__MWERKS__) && defined( __INTEL__) )
110    typedef _off_t off_t;
111#elif defined(__SYMANTEC__)
112    typedef long off_t;
113#elif defined(__MWERKS__) && !defined(__INTEL__) && !defined(__MACH__)
114    typedef long off_t;
115#endif
116
117enum wxSeekMode
118{
119  wxFromStart,
120  wxFromCurrent,
121  wxFromEnd
122};
123
124enum wxFileKind
125{
126  wxFILE_KIND_UNKNOWN,
127  wxFILE_KIND_DISK,     // a file supporting seeking to arbitrary offsets
128  wxFILE_KIND_TERMINAL, // a tty
129  wxFILE_KIND_PIPE      // a pipe
130};
131
132// ----------------------------------------------------------------------------
133// declare our versions of low level file functions: some compilers prepend
134// underscores to the usual names, some also have Unicode versions of them
135// ----------------------------------------------------------------------------
136
137// Wrappers around Win32 api functions like CreateFile, ReadFile and such
138// Implemented in filefnwce.cpp
139#if defined( __WXWINCE__)
140    typedef __int64 wxFileOffset;
141    #define wxFileOffsetFmtSpec _("I64")
142    int wxOpen(const wxChar *filename, int oflag, int WXUNUSED(pmode));
143    int wxAccess(const wxChar *name, int WXUNUSED(how));
144    int wxClose(int fd);
145    int wxFsync(int WXUNUSED(fd));
146    int wxRead(int fd, void *buf, unsigned int count);
147    int wxWrite(int fd, const void *buf, unsigned int count);
148    int wxEof(int fd);
149    wxFileOffset wxSeek(int fd, wxFileOffset offset, int origin);
150    #define wxLSeek wxSeek
151    wxFileOffset wxTell(int fd);
152
153    // always Unicode under WinCE
154    #define   wxMkDir      _wmkdir
155    #define   wxRmDir      _wrmdir
156    #define   wxStat       _wstat
157    #define   wxStructStat struct _stat
158#elif (defined(__WXMSW__) || defined(__OS2__)) && !defined(__WXPALMOS__) && \
159      ( \
160        defined(__VISUALC__) || \
161        (defined(__MINGW32__) && !defined(__WINE__) && \
162                                wxCHECK_W32API_VERSION(0, 5)) || \
163        defined(__MWERKS__) || \
164        defined(__DMC__) || \
165        defined(__WATCOMC__) || \
166        defined(__BORLANDC__) \
167      )
168
169    // temporary defines just used immediately below
170    #undef wxHAS_HUGE_FILES
171    #undef wxHAS_HUGE_STDIO_FILES
172
173    // detect compilers which have support for huge files
174    #if defined(__VISUALC__)
175        #define wxHAS_HUGE_FILES 1
176    #elif defined(__MINGW32__)
177        #define wxHAS_HUGE_FILES 1
178    #elif defined(_LARGE_FILES)
179        #define wxHAS_HUGE_FILES 1
180    #endif
181
182    // detect compilers which have support for huge stdio files
183    #if defined __VISUALC__ && __VISUALC__ >= 1400
184        #define wxHAS_HUGE_STDIO_FILES
185        #define wxFseek _fseeki64
186        #define wxFtell _ftelli64
187    #elif wxCHECK_MINGW32_VERSION(3, 5) // mingw-runtime version (not gcc)
188        #define wxHAS_HUGE_STDIO_FILES
189        #define wxFseek fseeko64
190        #define wxFtell ftello64
191    #endif
192
193    // other Windows compilers (DMC, Watcom, Metrowerks and Borland) don't have
194    // huge file support (or at least not all functions needed for it by wx)
195    // currently
196
197    #ifdef wxHAS_HUGE_FILES
198        typedef wxLongLong_t wxFileOffset;
199        #define wxFileOffsetFmtSpec wxLongLongFmtSpec
200    #else
201        typedef off_t wxFileOffset;
202    #endif
203
204
205    // functions
206
207    // MSVC and compatible compilers prepend underscores to the POSIX function
208    // names, other compilers don't and even if their later versions usually do
209    // define the versions with underscores for MSVC compatibility, it's better
210    // to avoid using them as they're not present in earlier versions and
211    // always using the native functions spelling is easier than testing for
212    // the versions
213    #if defined(__BORLANDC__) || defined(__DMC__) || defined(__WATCOMC__) || defined(__MINGW64__)
214        #define wxPOSIX_IDENT(func)    ::func
215    #else // by default assume MSVC-compatible names
216        #define wxPOSIX_IDENT(func)    _ ## func
217        #define wxHAS_UNDERSCORES_IN_POSIX_IDENTS
218    #endif
219
220    // at least Borland 5.5 doesn't like "struct ::stat" so don't use the scope
221    // resolution operator present in wxPOSIX_IDENT for it
222    #ifdef __BORLANDC__
223        #define wxPOSIX_STRUCT(s)    struct s
224    #else
225        #define wxPOSIX_STRUCT(s)    struct wxPOSIX_IDENT(s)
226    #endif
227
228    // first functions not working with strings, i.e. without ANSI/Unicode
229    // complications
230    #define   wxClose      wxPOSIX_IDENT(close)
231
232    #if defined(__MWERKS__)
233        #if __MSL__ >= 0x6000
234            #define wxRead(fd, buf, nCount)  _read(fd, (void *)buf, nCount)
235            #define wxWrite(fd, buf, nCount) _write(fd, (void *)buf, nCount)
236        #else
237            #define wxRead(fd, buf, nCount)\
238                  _read(fd, (const char *)buf, nCount)
239            #define wxWrite(fd, buf, nCount)\
240                  _write(fd, (const char *)buf, nCount)
241        #endif
242    #else // __MWERKS__
243        #define wxRead         wxPOSIX_IDENT(read)
244        #define wxWrite        wxPOSIX_IDENT(write)
245    #endif
246
247    #ifdef wxHAS_HUGE_FILES
248        #ifndef __MINGW64__
249            #define   wxSeek       wxPOSIX_IDENT(lseeki64)
250            #define   wxLseek      wxPOSIX_IDENT(lseeki64)
251            #define   wxTell       wxPOSIX_IDENT(telli64)
252        #else
253            // unfortunately, mingw-W64 is somewhat inconsistent...
254            #define   wxSeek       _lseeki64
255            #define   wxLseek      _lseeki64
256            #define   wxTell       _telli64
257        #endif
258    #else // !wxHAS_HUGE_FILES
259        #define   wxSeek       wxPOSIX_IDENT(lseek)
260        #define   wxLseek      wxPOSIX_IDENT(lseek)
261        #define   wxTell       wxPOSIX_IDENT(tell)
262    #endif // wxHAS_HUGE_FILES/!wxHAS_HUGE_FILES
263
264    #ifndef __WATCOMC__
265         #if !defined(__BORLANDC__) || (__BORLANDC__ > 0x540)
266             // NB: this one is not POSIX and always has the underscore
267             #define   wxFsync      _commit
268
269             // could be already defined by configure (Cygwin)
270             #ifndef HAVE_FSYNC
271                 #define HAVE_FSYNC
272             #endif
273        #endif // BORLANDC
274    #endif
275
276    #define   wxEof        wxPOSIX_IDENT(eof)
277
278    // then the functions taking strings
279    #if wxUSE_UNICODE
280        #if wxUSE_UNICODE_MSLU
281            // implement the missing file functions in Win9x ourselves
282            #if defined( __VISUALC__ ) \
283                || ( defined(__MINGW32__) && wxCHECK_W32API_VERSION( 0, 5 ) ) \
284                || ( defined(__MWERKS__) && defined(__WXMSW__) ) \
285                || ( defined(__BORLANDC__) && (__BORLANDC__ > 0x460) ) \
286                || defined(__DMC__)
287
288                WXDLLIMPEXP_BASE int wxMSLU__wopen(const wxChar *name,
289                                                   int flags, int mode);
290                WXDLLIMPEXP_BASE int wxMSLU__waccess(const wxChar *name,
291                                                     int mode);
292                WXDLLIMPEXP_BASE int wxMSLU__wmkdir(const wxChar *name);
293                WXDLLIMPEXP_BASE int wxMSLU__wrmdir(const wxChar *name);
294
295                WXDLLIMPEXP_BASE int
296                wxMSLU__wstat(const wxChar *name, wxPOSIX_STRUCT(stat) *buffer);
297                WXDLLIMPEXP_BASE int
298                wxMSLU__wstati64(const wxChar *name,
299                                 wxPOSIX_STRUCT(stati64) *buffer);
300            #endif // Windows compilers with MSLU support
301
302            #define   wxOpen       wxMSLU__wopen
303
304            #define   wxAccess     wxMSLU__waccess
305            #define   wxMkDir      wxMSLU__wmkdir
306            #define   wxRmDir      wxMSLU__wrmdir
307            #ifdef wxHAS_HUGE_FILES
308                #define   wxStat       wxMSLU__wstati64
309            #else
310                #define   wxStat       wxMSLU__wstat
311            #endif
312        #else // !wxUSE_UNICODE_MSLU
313            #ifdef __BORLANDC__
314                #if __BORLANDC__ >= 0x550 && __BORLANDC__ <= 0x551
315                    WXDLLIMPEXP_BASE int wxOpen(const wxChar *pathname,
316                                                int flags, mode_t mode);
317                #else
318                    #define   wxOpen       _wopen
319                #endif
320                #define   wxAccess     _waccess
321                #define   wxMkDir      _wmkdir
322                #define   wxRmDir      _wrmdir
323                #ifdef wxHAS_HUGE_FILES
324                    #define   wxStat       _wstati64
325                #else
326                    #define   wxStat       _wstat
327                #endif
328            #else
329                #define   wxOpen       _wopen
330                #define   wxAccess     _waccess
331                #define   wxMkDir      _wmkdir
332                #define   wxRmDir      _wrmdir
333                #ifdef wxHAS_HUGE_FILES
334                    #define   wxStat       _wstati64
335                #else
336                    #define   wxStat       _wstat
337                #endif
338            #endif
339        #endif // wxUSE_UNICODE_MSLU/!wxUSE_UNICODE_MSLU
340    #else // !wxUSE_UNICODE
341        #define   wxOpen       wxPOSIX_IDENT(open)
342        #define   wxAccess     wxPOSIX_IDENT(access)
343        #define   wxMkDir      wxPOSIX_IDENT(mkdir)
344        #define   wxRmDir      wxPOSIX_IDENT(rmdir)
345        #ifdef wxHAS_HUGE_FILES
346            #define   wxStat       wxPOSIX_IDENT(stati64)
347        #else
348            // Unfortunately Watcom is not consistent, so:-
349            #if defined(__OS2__) && defined(__WATCOMC__)
350                #define   wxStat       _stat
351            #else
352                #if defined (__BORLANDC__)
353                    #define   wxStat       _stat //wxPOSIX_IDENT(stat)
354                #else
355                    #define   wxStat       wxPOSIX_IDENT(stat)
356                #endif // !borland
357            #endif // !watcom
358        #endif
359    #endif // wxUSE_UNICODE/!wxUSE_UNICODE
360
361    // Types: Notice that Watcom is the only compiler to have a wide char
362    // version of struct stat as well as a wide char stat function variant.
363    // This was droped since OW 1.4 "for consistency across platforms".
364    #ifdef wxHAS_HUGE_FILES
365        #if wxUSE_UNICODE && wxONLY_WATCOM_EARLIER_THAN(1,4)
366            #define   wxStructStat struct _wstati64
367        #else
368            #define   wxStructStat struct _stati64
369        #endif
370    #else
371        #if wxUSE_UNICODE && wxONLY_WATCOM_EARLIER_THAN(1,4)
372            #define   wxStructStat struct _wstat
373        #else
374            #define   wxStructStat struct _stat
375        #endif
376    #endif
377
378    // constants (unless already defined by the user code)
379    #ifdef wxHAS_UNDERSCORES_IN_POSIX_IDENTS
380        #ifndef O_RDONLY
381            #define   O_RDONLY    _O_RDONLY
382            #define   O_WRONLY    _O_WRONLY
383            #define   O_RDWR      _O_RDWR
384            #define   O_EXCL      _O_EXCL
385            #define   O_CREAT     _O_CREAT
386            #define   O_BINARY    _O_BINARY
387        #endif
388
389        #ifndef S_IFMT
390            #define   S_IFMT      _S_IFMT
391            #define   S_IFDIR     _S_IFDIR
392            #define   S_IFREG     _S_IFREG
393        #endif
394    #endif // wxHAS_UNDERSCORES_IN_POSIX_IDENTS
395
396    #ifdef wxHAS_HUGE_FILES
397        // wxFile is present and supports large files.
398        #if wxUSE_FILE
399            #define wxHAS_LARGE_FILES
400        #endif
401        // wxFFile is present and supports large files
402        #if wxUSE_FFILE && defined wxHAS_HUGE_STDIO_FILES
403            #define wxHAS_LARGE_FFILES
404        #endif
405    #endif
406
407    // private defines, undefine so that nobody gets tempted to use
408    #undef wxHAS_HUGE_FILES
409    #undef wxHAS_HUGE_STDIO_FILES
410#else // Unix or Windows using unknown compiler, assume POSIX supported
411    typedef off_t wxFileOffset;
412    #ifdef _LARGE_FILES
413        #define wxFileOffsetFmtSpec wxLongLongFmtSpec
414        wxCOMPILE_TIME_ASSERT( sizeof(off_t) == sizeof(wxLongLong_t),
415                                BadFileSizeType );
416        // wxFile is present and supports large files
417        #ifdef wxUSE_FILE
418            #define wxHAS_LARGE_FILES
419        #endif
420        // wxFFile is present and supports large files
421        #if SIZEOF_LONG == 8 || defined HAVE_FSEEKO
422            #define wxHAS_LARGE_FFILES
423        #endif
424        #ifdef HAVE_FSEEKO
425            #define wxFseek fseeko
426            #define wxFtell ftello
427        #endif
428    #else
429        #define wxFileOffsetFmtSpec wxT("")
430    #endif
431    // functions
432    #define   wxClose      close
433    #define   wxRead       ::read
434    #define   wxWrite      ::write
435    #define   wxLseek      lseek
436    #define   wxSeek       lseek
437    #define   wxFsync      fsync
438    #define   wxEof        eof
439
440    #define   wxMkDir      mkdir
441    #define   wxRmDir      rmdir
442
443    #define   wxTell(fd)   lseek(fd, 0, SEEK_CUR)
444
445    #define   wxStructStat struct stat
446
447    #if wxUSE_UNICODE
448        #define wxNEED_WX_UNISTD_H
449        #if defined(__DMC__)
450            typedef unsigned long mode_t;
451        #endif
452        WXDLLIMPEXP_BASE int wxStat( const wxChar *file_name, wxStructStat *buf );
453        WXDLLIMPEXP_BASE int wxLstat( const wxChar *file_name, wxStructStat *buf );
454        WXDLLIMPEXP_BASE int wxAccess( const wxChar *pathname, int mode );
455        WXDLLIMPEXP_BASE int wxOpen( const wxChar *pathname, int flags, mode_t mode );
456    #else
457        #define   wxOpen       open
458        #define   wxStat       stat
459        #define   wxLstat      lstat
460        #define   wxAccess     access
461    #endif
462
463    #define wxHAS_NATIVE_LSTAT
464#endif // platforms
465
466// define wxFseek/wxFtell to large file versions if available (done above) or
467// to fseek/ftell if not, to save ifdefs in using code
468#ifndef wxFseek
469    #define wxFseek fseek
470#endif
471#ifndef wxFtell
472    #define wxFtell ftell
473#endif
474
475#ifdef O_BINARY
476    #define wxO_BINARY O_BINARY
477#else
478    #define wxO_BINARY 0
479#endif
480
481// if the platform doesn't have symlinks, define wxLstat to be the same as
482// wxStat to avoid #ifdefs in the code using it
483#ifndef wxHAS_NATIVE_LSTAT
484    #define wxLstat wxStat
485#endif
486
487#if defined(__VISAGECPP__) && __IBMCPP__ >= 400
488//
489// VisualAge C++ V4.0 cannot have any external linkage const decs
490// in headers included by more than one primary source
491//
492extern const int wxInvalidOffset;
493#else
494const int wxInvalidOffset = -1;
495#endif
496
497// ----------------------------------------------------------------------------
498// functions
499// ----------------------------------------------------------------------------
500WXDLLIMPEXP_BASE bool wxFileExists(const wxString& filename);
501
502// does the path exist? (may have or not '/' or '\\' at the end)
503WXDLLIMPEXP_BASE bool wxDirExists(const wxChar *pszPathName);
504
505WXDLLIMPEXP_BASE bool wxIsAbsolutePath(const wxString& filename);
506
507// Get filename
508WXDLLIMPEXP_BASE wxChar* wxFileNameFromPath(wxChar *path);
509WXDLLIMPEXP_BASE wxString wxFileNameFromPath(const wxString& path);
510
511// Get directory
512WXDLLIMPEXP_BASE wxString wxPathOnly(const wxString& path);
513
514// wxString version
515WXDLLIMPEXP_BASE wxString wxRealPath(const wxString& path);
516
517WXDLLIMPEXP_BASE void wxDos2UnixFilename(wxChar *s);
518
519WXDLLIMPEXP_BASE void wxUnix2DosFilename(wxChar *s);
520
521// Strip the extension, in situ
522WXDLLIMPEXP_BASE void wxStripExtension(wxChar *buffer);
523WXDLLIMPEXP_BASE void wxStripExtension(wxString& buffer);
524
525// Get a temporary filename
526WXDLLIMPEXP_BASE wxChar* wxGetTempFileName(const wxString& prefix, wxChar *buf = (wxChar *) NULL);
527WXDLLIMPEXP_BASE bool wxGetTempFileName(const wxString& prefix, wxString& buf);
528
529// Expand file name (~/ and ${OPENWINHOME}/ stuff)
530WXDLLIMPEXP_BASE wxChar* wxExpandPath(wxChar *dest, const wxChar *path);
531WXDLLIMPEXP_BASE bool wxExpandPath(wxString& dest, const wxChar *path);
532
533// Contract w.r.t environment (</usr/openwin/lib, OPENWHOME> -> ${OPENWINHOME}/lib)
534// and make (if under the home tree) relative to home
535// [caller must copy-- volatile]
536WXDLLIMPEXP_BASE wxChar* wxContractPath(const wxString& filename,
537                                   const wxString& envname = wxEmptyString,
538                                   const wxString& user = wxEmptyString);
539
540// Destructive removal of /./ and /../ stuff
541WXDLLIMPEXP_BASE wxChar* wxRealPath(wxChar *path);
542
543// Allocate a copy of the full absolute path
544WXDLLIMPEXP_BASE wxChar* wxCopyAbsolutePath(const wxString& path);
545
546// Get first file name matching given wild card.
547// Flags are reserved for future use.
548#define wxFILE  1
549#define wxDIR   2
550WXDLLIMPEXP_BASE wxString wxFindFirstFile(const wxChar *spec, int flags = wxFILE);
551WXDLLIMPEXP_BASE wxString wxFindNextFile();
552
553// Does the pattern contain wildcards?
554WXDLLIMPEXP_BASE bool wxIsWild(const wxString& pattern);
555
556// Does the pattern match the text (usually a filename)?
557// If dot_special is true, doesn't match * against . (eliminating
558// `hidden' dot files)
559WXDLLIMPEXP_BASE bool wxMatchWild(const wxString& pattern,  const wxString& text, bool dot_special = true);
560
561// Concatenate two files to form third
562WXDLLIMPEXP_BASE bool wxConcatFiles(const wxString& file1, const wxString& file2, const wxString& file3);
563
564// Copy file1 to file2
565WXDLLIMPEXP_BASE bool wxCopyFile(const wxString& file1, const wxString& file2,
566                                 bool overwrite = true);
567
568// Remove file
569WXDLLIMPEXP_BASE bool wxRemoveFile(const wxString& file);
570
571// Rename file
572WXDLLIMPEXP_BASE bool wxRenameFile(const wxString& file1, const wxString& file2, bool overwrite = true);
573
574// Get current working directory.
575#if WXWIN_COMPATIBILITY_2_6
576// If buf is NULL, allocates space using new, else
577// copies into buf.
578// IMPORTANT NOTE getcwd is know not to work under some releases
579// of Win32s 1.3, according to MS release notes!
580wxDEPRECATED( WXDLLIMPEXP_BASE wxChar* wxGetWorkingDirectory(wxChar *buf = (wxChar *) NULL, int sz = 1000) );
581// new and preferred version of wxGetWorkingDirectory
582// NB: can't have the same name because of overloading ambiguity
583#endif // WXWIN_COMPATIBILITY_2_6
584WXDLLIMPEXP_BASE wxString wxGetCwd();
585
586// Set working directory
587WXDLLIMPEXP_BASE bool wxSetWorkingDirectory(const wxString& d);
588
589// Make directory
590WXDLLIMPEXP_BASE bool wxMkdir(const wxString& dir, int perm = 0777);
591
592// Remove directory. Flags reserved for future use.
593WXDLLIMPEXP_BASE bool wxRmdir(const wxString& dir, int flags = 0);
594
595// Return the type of an open file
596WXDLLIMPEXP_BASE wxFileKind wxGetFileKind(int fd);
597WXDLLIMPEXP_BASE wxFileKind wxGetFileKind(FILE *fp);
598
599#if WXWIN_COMPATIBILITY_2_6
600// compatibility defines, don't use in new code
601wxDEPRECATED( inline bool wxPathExists(const wxChar *pszPathName) );
602inline bool wxPathExists(const wxChar *pszPathName)
603{
604    return wxDirExists(pszPathName);
605}
606#endif //WXWIN_COMPATIBILITY_2_6
607
608// permissions; these functions work both on files and directories:
609WXDLLIMPEXP_BASE bool wxIsWritable(const wxString &path);
610WXDLLIMPEXP_BASE bool wxIsReadable(const wxString &path);
611WXDLLIMPEXP_BASE bool wxIsExecutable(const wxString &path);
612
613// ----------------------------------------------------------------------------
614// separators in file names
615// ----------------------------------------------------------------------------
616
617// between file name and extension
618#define wxFILE_SEP_EXT        wxT('.')
619
620// between drive/volume name and the path
621#define wxFILE_SEP_DSK        wxT(':')
622
623// between the path components
624#define wxFILE_SEP_PATH_DOS   wxT('\\')
625#define wxFILE_SEP_PATH_UNIX  wxT('/')
626#define wxFILE_SEP_PATH_MAC   wxT(':')
627#define wxFILE_SEP_PATH_VMS   wxT('.') // VMS also uses '[' and ']'
628
629// separator in the path list (as in PATH environment variable)
630// there is no PATH variable in Classic Mac OS so just use the
631// semicolon (it must be different from the file name separator)
632// NB: these are strings and not characters on purpose!
633#define wxPATH_SEP_DOS        wxT(";")
634#define wxPATH_SEP_UNIX       wxT(":")
635#define wxPATH_SEP_MAC        wxT(";")
636
637// platform independent versions
638#if defined(__UNIX__) && !defined(__OS2__)
639  // CYGWIN also uses UNIX settings
640  #define wxFILE_SEP_PATH     wxFILE_SEP_PATH_UNIX
641  #define wxPATH_SEP          wxPATH_SEP_UNIX
642#elif defined(__MAC__)
643  #define wxFILE_SEP_PATH     wxFILE_SEP_PATH_MAC
644  #define wxPATH_SEP          wxPATH_SEP_MAC
645#else   // Windows and OS/2
646  #define wxFILE_SEP_PATH     wxFILE_SEP_PATH_DOS
647  #define wxPATH_SEP          wxPATH_SEP_DOS
648#endif  // Unix/Windows
649
650// this is useful for wxString::IsSameAs(): to compare two file names use
651// filename1.IsSameAs(filename2, wxARE_FILENAMES_CASE_SENSITIVE)
652#if defined(__UNIX__) && !defined(__DARWIN__) && !defined(__OS2__)
653  #define wxARE_FILENAMES_CASE_SENSITIVE  true
654#else   // Windows, Mac OS and OS/2
655  #define wxARE_FILENAMES_CASE_SENSITIVE  false
656#endif  // Unix/Windows
657
658// is the char a path separator?
659inline bool wxIsPathSeparator(wxChar c)
660{
661    // under DOS/Windows we should understand both Unix and DOS file separators
662#if ( defined(__UNIX__) && !defined(__OS2__) )|| defined(__MAC__)
663    return c == wxFILE_SEP_PATH;
664#else
665    return c == wxFILE_SEP_PATH_DOS || c == wxFILE_SEP_PATH_UNIX;
666#endif
667}
668
669// does the string ends with path separator?
670WXDLLIMPEXP_BASE bool wxEndsWithPathSeparator(const wxChar *pszFileName);
671
672// split the full path into path (including drive for DOS), name and extension
673// (understands both '/' and '\\')
674WXDLLIMPEXP_BASE void wxSplitPath(const wxChar *pszFileName,
675                             wxString *pstrPath,
676                             wxString *pstrName,
677                             wxString *pstrExt);
678
679// find a file in a list of directories, returns false if not found
680WXDLLIMPEXP_BASE bool wxFindFileInPath(wxString *pStr, const wxChar *pszPath, const wxChar *pszFile);
681
682// Get the OS directory if appropriate (such as the Windows directory).
683// On non-Windows platform, probably just return the empty string.
684WXDLLIMPEXP_BASE wxString wxGetOSDirectory();
685
686#if wxUSE_DATETIME
687
688// Get file modification time
689WXDLLIMPEXP_BASE time_t wxFileModificationTime(const wxString& filename);
690
691#endif // wxUSE_DATETIME
692
693// Parses the wildCard, returning the number of filters.
694// Returns 0 if none or if there's a problem,
695// The arrays will contain an equal number of items found before the error.
696// wildCard is in the form:
697// "All files (*)|*|Image Files (*.jpeg *.png)|*.jpg;*.png"
698WXDLLIMPEXP_BASE int wxParseCommonDialogsFilter(const wxString& wildCard, wxArrayString& descriptions, wxArrayString& filters);
699
700// ----------------------------------------------------------------------------
701// classes
702// ----------------------------------------------------------------------------
703
704#ifdef __UNIX__
705
706// set umask to the given value in ctor and reset it to the old one in dtor
707class WXDLLIMPEXP_BASE wxUmaskChanger
708{
709public:
710    // change the umask to the given one if it is not -1: this allows to write
711    // the same code whether you really want to change umask or not, as is in
712    // wxFileConfig::Flush() for example
713    wxUmaskChanger(int umaskNew)
714    {
715        m_umaskOld = umaskNew == -1 ? -1 : (int)umask((mode_t)umaskNew);
716    }
717
718    ~wxUmaskChanger()
719    {
720        if ( m_umaskOld != -1 )
721            umask((mode_t)m_umaskOld);
722    }
723
724private:
725    int m_umaskOld;
726};
727
728// this macro expands to an "anonymous" wxUmaskChanger object under Unix and
729// nothing elsewhere
730#define wxCHANGE_UMASK(m) wxUmaskChanger wxMAKE_UNIQUE_NAME(umaskChanger_)(m)
731
732#else // !__UNIX__
733
734#define wxCHANGE_UMASK(m)
735
736#endif // __UNIX__/!__UNIX__
737
738
739// Path searching
740class WXDLLIMPEXP_BASE wxPathList : public wxArrayString
741{
742public:
743    wxPathList() {}
744    wxPathList(const wxArrayString &arr)
745        { Add(arr); }
746
747    // Adds all paths in environment variable
748    void AddEnvList(const wxString& envVariable);
749
750    // Adds given path to this list
751    bool Add(const wxString& path);
752    void Add(const wxArrayString &paths);
753
754    // Find the first full path for which the file exists
755    wxString FindValidPath(const wxString& filename) const;
756
757    // Find the first full path for which the file exists; ensure it's an
758    // absolute path that gets returned.
759    wxString FindAbsoluteValidPath(const wxString& filename) const;
760
761    // Given full path and filename, add path to list
762    bool EnsureFileAccessible(const wxString& path);
763
764#if WXWIN_COMPATIBILITY_2_6
765    // Returns true if the path is in the list
766    wxDEPRECATED( bool Member(const wxString& path) const );
767#endif
768};
769
770#endif // _WX_FILEFN_H_
771