added write_append mode to wxFile, implemented eof() for Unix

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@31 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1998-05-26 15:05:56 +00:00
parent 99b55eb078
commit 61b027446e
2 changed files with 35 additions and 25 deletions

View File

@ -50,7 +50,7 @@ public:
// -------------------
// opening mode
enum OpenMode { read, write, read_write };
enum OpenMode { read, write, read_write, write_append };
// standard values for file descriptor
enum { fd_invalid = -1, fd_stdin, fd_stdout, fd_stderr };
// seek type
@ -72,8 +72,12 @@ public:
// open/close
bool Create(const char *szFileName, bool bOverwrite = FALSE);
bool Open(const char *szFileName, OpenMode mode = read);
inline bool Close(); // Close is a NOP if not opened
// assign an existing file descriptor and get it back from wxFile object
void Attach(int fd) { Close(); m_fd = fd; }
inline void Close(); // Close is a NOP if not opened
void Detach() { m_fd = fd_invalid; }
int fd() const { return m_fd; }
// read/write (unbuffered)
// returns number of bytes read or ofsInvalid on error

View File

@ -120,8 +120,7 @@ bool wxFile::Create(const char *szFileName, bool bOverwrite)
{
// if bOverwrite we create a new file or truncate the existing one,
// otherwise we only create the new file and fail if it already exists
int fd = bOverwrite ? creat(szFileName, 0)
: open(szFileName, O_CREAT | O_EXCL);
int fd = open(szFileName, O_CREAT | (bOverwrite ? O_TRUNC : O_EXCL));
if ( fd == -1 ) {
wxLogSysError("can't create file '%s'", szFileName);
@ -144,7 +143,11 @@ bool wxFile::Open(const char *szFileName, OpenMode mode)
break;
case write:
flags |= O_WRONLY | O_CREAT;
flags |= O_WRONLY | O_CREAT | O_TRUNC;
break;
case write_append:
flags |= O_WRONLY | O_APPEND;
break;
case read_write:
@ -165,14 +168,19 @@ bool wxFile::Open(const char *szFileName, OpenMode mode)
}
// close
void wxFile::Close()
bool wxFile::Close()
{
if ( IsOpened() ) {
if ( close(m_fd) == -1 )
if ( close(m_fd) == -1 ) {
wxLogSysError("can't close file descriptor %d", m_fd);
m_fd = fd_invalid;
m_fd = fd_invalid;
return FALSE;
}
else
m_fd = fd_invalid;
}
return TRUE;
}
// ----------------------------------------------------------------------------
@ -211,7 +219,7 @@ bool wxFile::Write(const void *pBuf, uint nCount)
bool wxFile::Flush()
{
if ( IsOpened() ) {
// ## fsync() is not ANSI (BSDish)
// @@@ fsync() is not ANSI (BSDish)
// if ( fsync(m_fd) == -1 ) { // TODO
if (TRUE) {
wxLogSysError("can't flush file descriptor %d", m_fd);
@ -282,7 +290,7 @@ off_t wxFile::Length() const
#else
int iRc = tell(m_fd);
if ( iRc != -1 ) {
// # have to use const_cast :-(
// @ have to use const_cast :-(
int iLen = ((wxFile *)this)->SeekEnd();
if ( iLen != -1 ) {
// restore old position
@ -310,21 +318,19 @@ bool wxFile::Eof() const
{
wxASSERT( IsOpened() );
// TODO: no eof in GnuWin32
#ifdef __LINUX__
int iRc;
int iRc = Tell() == Length();
#else
#if defined(__GNUWIN32__)
int iRc = -1;
#else
int iRc = eof(m_fd);
#endif
#endif
#if defined(__UNIX__) || defined(__GNUWIN32__)
// @@ this doesn't work, of course, on unseekable file descriptors
off_t ofsCur = Tell(),
ofsMax = Length();
if ( ofsCur == ofsInvalid || ofsMax == ofsInvalid )
iRc = -1;
else
iRc = ofsCur == ofsMax;
#else // Windows and "native" compiler
iRc = eof(m_fd);
#endif // Windows/Unix
switch ( iRc ) {
case 1: