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