1 ///////////////////////////////////////////////////////////////////////////// 2 // Name: file.h 3 // Purpose: wxFile - encapsulates low-level "file descriptor" 4 // wxTempFile - safely replace the old file 5 // Author: Vadim Zeitlin 6 // Modified by: 7 // Created: 29/01/98 8 // RCS-ID: $Id: file.h 46331 2007-06-05 13:16:11Z JS $ 9 // Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr> 10 // Licence: wxWindows licence 11 ///////////////////////////////////////////////////////////////////////////// 12 13 #ifndef _WX_FILEH__ 14 #define _WX_FILEH__ 15 16 #include "wx/defs.h" 17 18 #if wxUSE_FILE 19 20 #include "wx/string.h" 21 #include "wx/filefn.h" 22 #include "wx/strconv.h" 23 24 // ---------------------------------------------------------------------------- 25 // constants 26 // ---------------------------------------------------------------------------- 27 28 // we redefine these constants here because S_IREAD &c are _not_ standard 29 // however, we do assume that the values correspond to the Unix umask bits 30 #define wxS_IRUSR 00400 31 #define wxS_IWUSR 00200 32 #define wxS_IXUSR 00100 33 34 #define wxS_IRGRP 00040 35 #define wxS_IWGRP 00020 36 #define wxS_IXGRP 00010 37 38 #define wxS_IROTH 00004 39 #define wxS_IWOTH 00002 40 #define wxS_IXOTH 00001 41 42 // default mode for the new files: corresponds to umask 022 43 #define wxS_DEFAULT (wxS_IRUSR | wxS_IWUSR | wxS_IRGRP | wxS_IWGRP |\ 44 wxS_IROTH | wxS_IWOTH) 45 46 // ---------------------------------------------------------------------------- 47 // class wxFile: raw file IO 48 // 49 // NB: for space efficiency this class has no virtual functions, including 50 // dtor which is _not_ virtual, so it shouldn't be used as a base class. 51 // ---------------------------------------------------------------------------- 52 53 class WXDLLIMPEXP_BASE wxFile 54 { 55 public: 56 // more file constants 57 // ------------------- 58 // opening mode 59 enum OpenMode { read, write, read_write, write_append, write_excl }; 60 // standard values for file descriptor 61 enum { fd_invalid = -1, fd_stdin, fd_stdout, fd_stderr }; 62 63 // static functions 64 // ---------------- 65 // check whether a regular file by this name exists 66 static bool Exists(const wxChar *name); 67 // check whether we can access the given file in given mode 68 // (only read and write make sense here) 69 static bool Access(const wxChar *name, OpenMode mode); 70 71 // ctors 72 // ----- 73 // def ctor wxFile()74 wxFile() { m_fd = fd_invalid; m_error = false; } 75 // open specified file (may fail, use IsOpened()) 76 wxFile(const wxChar *szFileName, OpenMode mode = read); 77 // attach to (already opened) file wxFile(int lfd)78 wxFile(int lfd) { m_fd = lfd; m_error = false; } 79 80 // open/close 81 // create a new file (with the default value of bOverwrite, it will fail if 82 // the file already exists, otherwise it will overwrite it and succeed) 83 bool Create(const wxChar *szFileName, bool bOverwrite = false, 84 int access = wxS_DEFAULT); 85 bool Open(const wxChar *szFileName, OpenMode mode = read, 86 int access = wxS_DEFAULT); 87 bool Close(); // Close is a NOP if not opened 88 89 // assign an existing file descriptor and get it back from wxFile object Attach(int lfd)90 void Attach(int lfd) { Close(); m_fd = lfd; m_error = false; } Detach()91 void Detach() { m_fd = fd_invalid; } fd()92 int fd() const { return m_fd; } 93 94 // read/write (unbuffered) 95 // returns number of bytes read or wxInvalidOffset on error 96 ssize_t Read(void *pBuf, size_t nCount); 97 // returns the number of bytes written 98 size_t Write(const void *pBuf, size_t nCount); 99 // returns true on success 100 bool Write(const wxString& s, const wxMBConv& conv = wxConvUTF8) 101 { 102 const wxWX2MBbuf buf = s.mb_str(conv); 103 if (!buf) 104 return false; 105 size_t size = strlen(buf); 106 return Write((const char *) buf, size) == size; 107 } 108 // flush data not yet written 109 bool Flush(); 110 111 // file pointer operations (return wxInvalidOffset on failure) 112 // move ptr ofs bytes related to start/current offset/end of file 113 wxFileOffset Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart); 114 // move ptr to ofs bytes before the end 115 wxFileOffset SeekEnd(wxFileOffset ofs = 0) { return Seek(ofs, wxFromEnd); } 116 // get current offset 117 wxFileOffset Tell() const; 118 // get current file length 119 wxFileOffset Length() const; 120 121 // simple accessors 122 // is file opened? IsOpened()123 bool IsOpened() const { return m_fd != fd_invalid; } 124 // is end of file reached? 125 bool Eof() const; 126 // has an error occurred? Error()127 bool Error() const { return m_error; } 128 // type such as disk or pipe GetKind()129 wxFileKind GetKind() const { return wxGetFileKind(m_fd); } 130 131 // dtor closes the file if opened ~wxFile()132 ~wxFile() { Close(); } 133 134 private: 135 // copy ctor and assignment operator are private because 136 // it doesn't make sense to copy files this way: 137 // attempt to do it will provoke a compile-time error. 138 wxFile(const wxFile&); 139 wxFile& operator=(const wxFile&); 140 141 int m_fd; // file descriptor or INVALID_FD if not opened 142 bool m_error; // error memory 143 }; 144 145 // ---------------------------------------------------------------------------- 146 // class wxTempFile: if you want to replace another file, create an instance 147 // of wxTempFile passing the name of the file to be replaced to the ctor. Then 148 // you can write to wxTempFile and call Commit() function to replace the old 149 // file (and close this one) or call Discard() to cancel the modification. If 150 // you call neither of them, dtor will call Discard(). 151 // ---------------------------------------------------------------------------- 152 153 class WXDLLIMPEXP_BASE wxTempFile 154 { 155 public: 156 // ctors 157 // default wxTempFile()158 wxTempFile() { } 159 // associates the temp file with the file to be replaced and opens it 160 wxTempFile(const wxString& strName); 161 162 // open the temp file (strName is the name of file to be replaced) 163 bool Open(const wxString& strName); 164 165 // is the file opened? IsOpened()166 bool IsOpened() const { return m_file.IsOpened(); } 167 // get current file length Length()168 wxFileOffset Length() const { return m_file.Length(); } 169 // move ptr ofs bytes related to start/current offset/end of file 170 wxFileOffset Seek(wxFileOffset ofs, wxSeekMode mode = wxFromStart) 171 { return m_file.Seek(ofs, mode); } 172 // get current offset Tell()173 wxFileOffset Tell() const { return m_file.Tell(); } 174 175 // I/O (both functions return true on success, false on failure) Write(const void * p,size_t n)176 bool Write(const void *p, size_t n) { return m_file.Write(p, n) == n; } 177 bool Write(const wxString& str, const wxMBConv& conv = wxConvUTF8) 178 { return m_file.Write(str, conv); } 179 180 // different ways to close the file 181 // validate changes and delete the old file of name m_strName 182 bool Commit(); 183 // discard changes 184 void Discard(); 185 186 // dtor calls Discard() if file is still opened 187 ~wxTempFile(); 188 189 private: 190 // no copy ctor/assignment operator 191 wxTempFile(const wxTempFile&); 192 wxTempFile& operator=(const wxTempFile&); 193 194 wxString m_strName, // name of the file to replace in Commit() 195 m_strTemp; // temporary file name 196 wxFile m_file; // the temporary file 197 }; 198 199 #endif // wxUSE_FILE 200 201 #endif // _WX_FILEH__ 202