home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2240.zip / wxWindows-2.4.0 / include / wx / file.h < prev    next >
C/C++ Source or Header  |  2002-09-05  |  7KB  |  192 lines

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