| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: file.h
- // Purpose: interface of wxTempFile, wxFile
- // Author: wxWidgets team
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @class wxTempFile
- wxTempFile provides a relatively safe way to replace the contents of the
- existing file. The name is explained by the fact that it may be also used as
- just a temporary file if you don't replace the old file contents.
- Usually, when a program replaces the contents of some file it first opens it for
- writing, thus losing all of the old data and then starts recreating it.
- This approach is not very safe because during the regeneration of the file bad
- things may happen: the program may find that there is an internal error preventing
- it from completing file generation, the user may interrupt it (especially if file
- generation takes long time) and, finally, any other external interrupts (power
- supply failure or a disk error) will leave you without either the original file
- or the new one.
- wxTempFile addresses this problem by creating a temporary file which is meant to
- replace the original file - but only after it is fully written. So, if the user
- interrupts the program during the file generation, the old file won't be lost.
- Also, if the program discovers itself that it doesn't want to replace the old
- file there is no problem - in fact, wxTempFile will @b not replace the old
- file by default, you should explicitly call wxTempFile::Commit() to do it.
- Calling wxTempFile::Discard() explicitly discards any modifications: it
- closes and deletes the temporary file and leaves the original file unchanged.
- If you call neither Commit() nor Discard(), the destructor will
- call Discard() automatically.
- To summarize: if you want to replace another file, create an instance of
- wxTempFile passing the name of the file to be replaced to the constructor.
- (You may also use default constructor and pass the file name to wxTempFile::Open.)
- Then you can write to wxTempFile using wxFile-like functions and later call
- wxTempFile::Commit() to replace the old file (and close this one) or call
- wxTempFile::Discard() to cancel the modifications.
- @library{wxbase}
- @category{file}
- */
- class wxTempFile
- {
- public:
- /**
- Associates wxTempFile with the file to be replaced and opens it.
- @warning
- You should use IsOpened() to verify that the constructor succeeded.
- */
- wxTempFile(const wxString& strName);
- /**
- Destructor calls Discard() if temporary file is still open.
- */
- ~wxTempFile();
- /**
- Validate changes: deletes the old file of name m_strName and renames the new
- file to the old name. Returns @true if both actions succeeded.
- If @false is returned it may unfortunately mean two quite different things:
- either that the old file couldn't be deleted or that the new file
- couldn't be renamed to the old name.
- */
- bool Commit();
- /**
- Discard changes: the old file contents are not changed, the temporary
- file is deleted.
- */
- void Discard();
- /**
- Flush the data written to the file to disk.
- This simply calls wxFile::Flush() for the underlying file and may be
- necessary with file systems such as XFS and Ext4 under Linux. Calling
- this function may however have serious performance implications and
- also is not necessary with many other file systems so it is not done by
- default -- but you can call it before calling Commit() to absolutely
- ensure that the data was indeed written to the disk correctly.
- */
- bool Flush();
- /**
- Returns @true if the file was successfully opened.
- */
- bool IsOpened() const;
- /**
- Returns the length of the file.
- This method may return ::wxInvalidOffset if the length couldn't be
- determined or 0 even for non-empty files if the file is not seekable.
- In general, the only way to determine if the file for which this function
- returns 0 is really empty or not is to try reading from it.
- */
- wxFileOffset Length() const;
- /**
- Open the temporary file, returns @true on success, @false if an error
- occurred.
- @a strName is the name of file to be replaced. The temporary file is always
- created in the directory where @a strName is. In particular, if @a strName
- doesn't include the path, it is created in the current directory and the
- program should have write access to it for the function to succeed.
- */
- bool Open(const wxString& strName);
- /**
- Seeks to the specified position.
- */
- wxFileOffset Seek(wxFileOffset ofs,
- wxSeekMode mode = wxFromStart);
- /**
- Returns the current position or ::wxInvalidOffset if file is not opened or
- if another error occurred.
- */
- wxFileOffset Tell() const;
- /**
- Write to the file, return @true on success, @false on failure.
- The second argument is only meaningful in Unicode build of wxWidgets when
- @a conv is used to convert @a str to multibyte representation.
- */
- bool Write(const wxString& str,
- const wxMBConv& conv = wxConvUTF8);
- };
- /**
- @class wxFile
- A wxFile performs raw file I/O. This is a very small class designed to
- minimize the overhead of using it - in fact, there is hardly any overhead at
- all, but using it brings you automatic error checking and hides differences
- between platforms and compilers. wxFile also automatically closes the file in
- its destructor so you won't forget to do so.
- wxFile is a wrapper around @c file descriptor. - see also wxFFile for a
- wrapper around @c FILE structure.
- ::wxFileOffset is used by the wxFile functions which require offsets as
- parameter or return them. If the platform supports it, wxFileOffset is a
- typedef for a native 64 bit integer, otherwise a 32 bit integer is used for
- ::wxFileOffset.
- @library{wxbase}
- @category{file}
- */
- class wxFile
- {
- public:
- /**
- The OpenMode enumeration defines the different modes for opening a file with wxFile.
- It is also used with wxFile::Access function.
- */
- enum OpenMode {
- /** Open file for reading or test if it can be opened for reading with Access() */
- read,
- /** Open file for writing deleting the contents of the file if it already exists
- or test if it can be opened for writing with Access(). */
- write,
- /** Open file for reading and writing; cannot be used with Access() */
- read_write,
- /** Open file for appending: the file is opened for writing, but the old contents
- of the file are not erased and the file pointer is initially placed at the end
- of the file; cannot be used with Access().
- This is the same as OpenMode::write if the file doesn't exist.
- */
- write_append,
- /**
- Open the file securely for writing (Uses O_EXCL | O_CREAT).
- Will fail if the file already exists, else create and open it atomically.
- Useful for opening temporary files without being vulnerable to race exploits.
- */
- write_excl
- };
- /**
- Standard file descriptors
- */
- enum { fd_invalid = -1, fd_stdin, fd_stdout, fd_stderr };
- /**
- Default constructor.
- */
- wxFile();
- /**
- Opens a file with a filename.
- @param filename
- The filename.
- @param mode
- The mode in which to open the file.
- @warning
- You should use IsOpened() to verify that the constructor succeeded.
- */
- wxFile(const wxString& filename,
- wxFile::OpenMode mode = wxFile::read);
- /**
- Associates the file with the given file descriptor, which has already been
- opened. See Attach() for the list of predefined descriptors.
- @param fd
- An existing file descriptor.
- */
- wxFile(int fd);
- /**
- Destructor will close the file.
- @note This destructor is not virtual so you should not use wxFile polymorphically.
- */
- ~wxFile();
- /**
- Returns the error code for the last unsuccessful operation.
- The error code is system-dependent and corresponds to the value of the
- standard @c errno variable when the last error occurred.
- Notice that only simple accessors such as IsOpened() and Eof() (and
- this method itself) don't modify the last error value, all other
- methods can potentially change it if an error occurs, including the
- const ones such as Tell() or Length().
- @since 2.9.2
- @see ClearLastError()
- */
- int GetLastError() const;
- /**
- Resets the error code.
- GetLastError() will return 0 until the next error occurs.
- @since 2.9.2
- */
- void ClearLastError();
- /**
- This function verifies if we may access the given file in specified mode.
- Only values of @c wxFile::read or @c wxFile::write really make sense here.
- */
- static bool Access(const wxString& name, wxFile::OpenMode mode);
- /**
- Attaches an existing file descriptor to the wxFile object.
- Examples of predefined file descriptors are 0, 1 and 2 which correspond to
- stdin, stdout and stderr (and have symbolic names of @c wxFile::fd_stdin,
- @c wxFile::fd_stdout and @c wxFile::fd_stderr).
- The descriptor should be already opened and it will be closed by wxFile
- object.
- */
- void Attach(int fd);
- /**
- Closes the file.
- */
- bool Close();
- /**
- Creates a file for writing.
- If the file already exists, setting @b overwrite to @true will ensure
- it is overwritten.
- @a access may be an OR combination of the ::wxPosixPermissions enumeration
- values.
- */
- bool Create(const wxString& filename,
- bool overwrite = false,
- int access = wxS_DEFAULT);
- /**
- Get back a file descriptor from wxFile object - the caller is responsible for
- closing the file if this descriptor is opened.
- IsOpened() will return @false after call to Detach().
- @return The file descriptor (this is new since wxWidgets 3.0.0, in the
- previous versions this method didn't return anything).
- */
- int Detach();
- /**
- Returns @true if the end of the file has been reached.
- Note that the behaviour of the file pointer-based class wxFFile is
- different as wxFFile::Eof() will return @true here only if an
- attempt has been made to read @b past the last byte of the file, while
- wxFile::Eof() will return @true even before such attempt is made if the
- file pointer is at the last position in the file.
- Note also that this function doesn't work on unseekable file descriptors
- (examples include pipes, terminals and sockets under Unix) and an attempt to
- use it will result in an error message.
- So, to read the entire file into memory, you should write a loop which uses
- Read() repeatedly and tests its return condition instead of using Eof()
- as this will not work for special files under Unix.
- */
- bool Eof() const;
- /**
- Returns @true if the given name specifies an existing regular file
- (not a directory or a link).
- */
- static bool Exists(const wxString& filename);
- /**
- Flushes the file descriptor.
- Note that Flush() is not implemented on some Windows compilers due to a
- missing fsync function, which reduces the usefulness of this function
- (it can still be called but it will do nothing on unsupported compilers).
- */
- bool Flush();
- /**
- Returns the type of the file.
- */
- wxFileKind GetKind() const;
- /**
- Returns @true if the file has been opened.
- */
- bool IsOpened() const;
- /**
- Returns the length of the file.
- */
- wxFileOffset Length() const;
- /**
- Opens the file, returning @true if successful.
- @param filename
- The filename.
- @param mode
- The mode in which to open the file.
- @param access
- An OR-combination of ::wxPosixPermissions enumeration values.
- */
- bool Open(const wxString& filename, wxFile::OpenMode mode = wxFile::read,
- int access = wxS_DEFAULT);
- /**
- Reads from the file into a memory buffer.
- @param buffer
- Buffer to write in
- @param count
- Bytes to read
- @return The number of bytes read, or the symbol ::wxInvalidOffset.
- */
- ssize_t Read(void* buffer, size_t count);
- /**
- Reads the entire contents of the file into a string.
- @param str
- Non-@NULL pointer to a string to read data into.
- @param conv
- Conversion object to use in Unicode build; by default supposes
- that file contents is encoded in UTF-8 but falls back to the
- current locale encoding (or Latin-1 if it is UTF-8 too) if it is
- not.
- @return @true if file was read successfully, @false otherwise.
- @since 2.9.5
- */
- bool ReadAll(wxString* str, const wxMBConv& conv = wxConvAuto());
- /**
- Seeks to the specified position.
- @param ofs
- Offset to seek to.
- @param mode
- One of wxFromStart, wxFromEnd, wxFromCurrent.
- @return The actual offset position achieved, or ::wxInvalidOffset on
- failure.
- */
- wxFileOffset Seek(wxFileOffset ofs,
- wxSeekMode mode = wxFromStart);
- /**
- Moves the file pointer to the specified number of bytes relative to the
- end of the file. For example, @c SeekEnd(-5) would position the pointer 5
- bytes before the end.
- @param ofs
- Number of bytes before the end of the file.
- @return The actual offset position achieved, or ::wxInvalidOffset on
- failure.
- */
- wxFileOffset SeekEnd(wxFileOffset ofs = 0);
- /**
- Returns the current position or ::wxInvalidOffset if file is not opened or
- if another error occurred.
- */
- wxFileOffset Tell() const;
- /**
- Write data to the file (descriptor).
- @param buffer
- Buffer from which to read data
- @param count
- Number of bytes to write
- @return The number of bytes written.
- */
- size_t Write(const void *buffer, size_t count);
- /**
- Writes the contents of the string to the file, returns @true on success.
- The second argument is only meaningful in Unicode build of wxWidgets when
- @a conv is used to convert @a s to a multibyte representation.
- Note that this method only works with @c NUL-terminated strings, if you want
- to write data with embedded @c NULs to the file you should use the other
- Write() overload.
- */
- bool Write(const wxString& s, const wxMBConv& conv = wxConvUTF8);
- /**
- Returns the file descriptor associated with the file.
- */
- int fd() const;
- };
|