|
Packit |
1c1d7e |
/****************************************************************************
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Implementation of QFile class
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Created : 930812
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is part of the tools module of the Qt GUI Toolkit.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed under the terms of the Q Public License
|
|
Packit |
1c1d7e |
** as defined by Trolltech AS of Norway and appearing in the file
|
|
Packit |
1c1d7e |
** LICENSE.QPL included in the packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file may be distributed and/or modified under the terms of the
|
|
Packit |
1c1d7e |
** GNU General Public License version 2 as published by the Free Software
|
|
Packit |
1c1d7e |
** Foundation and appearing in the file LICENSE.GPL included in the
|
|
Packit |
1c1d7e |
** packaging of this file.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
|
|
Packit |
1c1d7e |
** licenses may use this file in accordance with the Qt Commercial License
|
|
Packit |
1c1d7e |
** Agreement provided with the Software.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
|
Packit |
1c1d7e |
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
|
|
Packit |
1c1d7e |
** information about Qt Commercial License Agreements.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/qpl/ for QPL licensing information.
|
|
Packit |
1c1d7e |
** See http://www.trolltech.com/gpl/ for GPL licensing information.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
** Contact info@trolltech.com if any conditions of this licensing are
|
|
Packit |
1c1d7e |
** not clear to you.
|
|
Packit |
1c1d7e |
**
|
|
Packit |
1c1d7e |
**********************************************************************/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qglobal.h"
|
|
Packit |
1c1d7e |
#if defined(_OS_WIN32_)
|
|
Packit |
1c1d7e |
#ifdef UNICODE
|
|
Packit |
1c1d7e |
#ifndef _UNICODE
|
|
Packit |
1c1d7e |
#define _UNICODE
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#include "qfile.h"
|
|
Packit |
1c1d7e |
#include "qfiledefs_p.h"
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
extern bool qt_file_access( const QString& fn, int t );
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
// NOT REVISED
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\class QFile qfile.h
|
|
Packit |
1c1d7e |
\brief The QFile class is an I/O device that operates on files.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\ingroup io
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QFile is an I/O device for reading and writing binary and text files. A
|
|
Packit |
1c1d7e |
QFile may be used by itself (readBlock and writeBlock) or by more
|
|
Packit |
1c1d7e |
conveniently using QDataStream or QTextStream.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Here is a code fragment that uses QTextStream to read a text
|
|
Packit |
1c1d7e |
file line by line. It prints each line with a line number.
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
QFile f("file.txt");
|
|
Packit |
1c1d7e |
if ( f.open(IO_ReadOnly) ) { // file opened successfully
|
|
Packit |
1c1d7e |
QTextStream t( &f ); // use a text stream
|
|
Packit |
1c1d7e |
QString s;
|
|
Packit |
1c1d7e |
int n = 1;
|
|
Packit |
1c1d7e |
while ( !t.eof() ) { // until end of file...
|
|
Packit |
1c1d7e |
s = t.readLine(); // line of text excluding '\n'
|
|
Packit |
1c1d7e |
printf( "%3d: %s\n", n++, (const char *)s );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
f.close();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The QFileInfo class holds detailed information about a file, such as
|
|
Packit |
1c1d7e |
access permissions, file dates and file types.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The QDir class manages directories and lists of file names.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa QDataStream, QTextStream
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Constructs a QFile with no name.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QFile::QFile()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
init();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Constructs a QFile with a file name \e name.
|
|
Packit |
1c1d7e |
\sa setName()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QFile::QFile( const QString &name )
|
|
Packit |
1c1d7e |
: fn(name)
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
init();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Destructs a QFile. Calls close().
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QFile::~QFile()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
close();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Initialize internal data.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QFile::init()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
setFlags( IO_Direct );
|
|
Packit |
1c1d7e |
setStatus( IO_Ok );
|
|
Packit |
1c1d7e |
fh = 0;
|
|
Packit |
1c1d7e |
fd = 0;
|
|
Packit |
1c1d7e |
length = 0;
|
|
Packit |
1c1d7e |
ioIndex = 0;
|
|
Packit |
1c1d7e |
ext_f = FALSE; // not an external file handle
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn QString QFile::name() const
|
|
Packit |
1c1d7e |
Returns the name set by setName().
|
|
Packit |
1c1d7e |
\sa setName(), QFileInfo::fileName()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Sets the name of the file. The name can include an absolute directory
|
|
Packit |
1c1d7e |
path or it can be a name or a path relative to the current directory.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Do not call this function if the file has already been opened.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Note that if the name is relative QFile does not associate it with the
|
|
Packit |
1c1d7e |
current directory. If you change directory before calling open(), open
|
|
Packit |
1c1d7e |
uses the new current directory.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Example:
|
|
Packit |
1c1d7e |
\code
|
|
Packit |
1c1d7e |
QFile f;
|
|
Packit |
1c1d7e |
QDir::setCurrent( "/tmp" );
|
|
Packit |
1c1d7e |
f.setName( "readme.txt" );
|
|
Packit |
1c1d7e |
QDir::setCurrent( "/home" );
|
|
Packit |
1c1d7e |
f.open( IO_ReadOnly ); // opens "/home/readme.txt" under UNIX
|
|
Packit |
1c1d7e |
\endcode
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Also note that the directory separator '/' works for all operating
|
|
Packit |
1c1d7e |
systems supported by Qt.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa name(), QFileInfo, QDir
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QFile::setName( const QString &name )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( isOpen() ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
qWarning( "QFile::setName: File is open" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
close();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
fn = name;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Returns TRUE if this file exists, otherwise FALSE.
|
|
Packit |
1c1d7e |
\sa name()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QFile::exists() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return qt_file_access( fn, F_OK );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Returns TRUE if the file given by \e fileName exists, otherwise FALSE.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QFile::exists( const QString &fileName )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return qt_file_access( fileName, F_OK );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Removes the file specified by the file name currently set.
|
|
Packit |
1c1d7e |
Returns TRUE if successful, otherwise FALSE.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The file is closed before it is removed.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QFile::remove()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
close();
|
|
Packit |
1c1d7e |
return remove( fn );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_) || defined(_OS_CYGWIN_)
|
|
Packit |
1c1d7e |
# define HAS_TEXT_FILEMODE // has translate/text filemode
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
#if defined(O_NONBLOCK)
|
|
Packit |
1c1d7e |
# define HAS_ASYNC_FILEMODE
|
|
Packit |
1c1d7e |
# define OPEN_ASYNC O_NONBLOCK
|
|
Packit |
1c1d7e |
#elif defined(O_NDELAY)
|
|
Packit |
1c1d7e |
# define HAS_ASYNC_FILEMODE
|
|
Packit |
1c1d7e |
# define OPEN_ASYNC O_NDELAY
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Flushes the file buffer to the disk.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
close() also flushes the file buffer.
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QFile::flush()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( isOpen() && fh ) // can only flush open/buffered
|
|
Packit |
1c1d7e |
fflush( fh ); // file
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Returns TRUE if the end of file has been reached, otherwise FALSE.
|
|
Packit |
1c1d7e |
\sa size()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
bool QFile::atEnd() const
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( !isOpen() ) {
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
qWarning( "QFile::atEnd: File is not open" );
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( isDirectAccess() && !isTranslated() ) {
|
|
Packit |
1c1d7e |
if ( at() < length )
|
|
Packit |
1c1d7e |
return FALSE;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return QIODevice::atEnd();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a line of text.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Reads bytes from the file until end-of-line is reached, or up to \a
|
|
Packit |
1c1d7e |
maxlen bytes, and returns the number of bytes read, or -1 in case of
|
|
Packit |
1c1d7e |
error. The terminating newline is not stripped.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This function is efficient only for buffered files. Avoid
|
|
Packit |
1c1d7e |
readLine() for files that have been opened with the \c IO_Raw
|
|
Packit |
1c1d7e |
flag.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa readBlock(), QTextStream::readLine()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QFile::readLine( char *p, uint maxlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
if ( maxlen == 0 ) // application bug?
|
|
Packit |
1c1d7e |
return 0;
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
CHECK_PTR( p );
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // file not open
|
|
Packit |
1c1d7e |
qWarning( "QFile::readLine: File not open" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isReadable() ) { // reading not permitted
|
|
Packit |
1c1d7e |
qWarning( "QFile::readLine: Read operation not permitted" );
|
|
Packit |
1c1d7e |
return -1;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
int nread; // number of bytes read
|
|
Packit |
1c1d7e |
if ( isRaw() ) { // raw file
|
|
Packit |
1c1d7e |
nread = QIODevice::readLine( p, maxlen );
|
|
Packit |
1c1d7e |
} else { // buffered file
|
|
Packit |
1c1d7e |
p = fgets( p, maxlen, fh );
|
|
Packit |
1c1d7e |
if ( p ) {
|
|
Packit |
1c1d7e |
nread = qstrlen( p );
|
|
Packit |
1c1d7e |
ioIndex += nread;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
nread = -1;
|
|
Packit |
1c1d7e |
setStatus(IO_ReadError);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return nread;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a line of text.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Reads bytes from the file until end-of-line is reached, or up to \a
|
|
Packit |
1c1d7e |
maxlen bytes, and returns the number of bytes read, or -1 in case of
|
|
Packit |
1c1d7e |
error. The terminating newline is not stripped.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This function is efficient only for buffered files. Avoid
|
|
Packit |
1c1d7e |
readLine() for files that have been opened with the \c IO_Raw
|
|
Packit |
1c1d7e |
flag.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Note that the string is read as plain Latin1 bytes, not Unicode.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa readBlock(), QTextStream::readLine()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QFile::readLine( QString& s, uint maxlen )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
QByteArray ba(maxlen);
|
|
Packit |
1c1d7e |
int l = readLine(ba.data(),maxlen);
|
|
Packit |
1c1d7e |
if ( l >= 0 ) {
|
|
Packit |
1c1d7e |
ba.truncate(l);
|
|
Packit |
1c1d7e |
s = QString(ba);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return l;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Reads a single byte/character from the file.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns the byte/character read, or -1 if the end of the file has been
|
|
Packit |
1c1d7e |
reached.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa putch(), ungetch()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QFile::getch()
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // file not open
|
|
Packit |
1c1d7e |
qWarning( "QFile::getch: File not open" );
|
|
Packit |
1c1d7e |
return EOF;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isReadable() ) { // reading not permitted
|
|
Packit |
1c1d7e |
qWarning( "QFile::getch: Read operation not permitted" );
|
|
Packit |
1c1d7e |
return EOF;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int ch;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( !ungetchBuffer.isEmpty() ) {
|
|
Packit |
1c1d7e |
int len = ungetchBuffer.length();
|
|
Packit |
1c1d7e |
ch = ungetchBuffer[ len-1 ];
|
|
Packit |
1c1d7e |
ungetchBuffer.truncate( len - 1 );
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( isRaw() ) { // raw file (inefficient)
|
|
Packit |
1c1d7e |
char buf[1];
|
|
Packit |
1c1d7e |
ch = readBlock( buf, 1 ) == 1 ? buf[0] : EOF;
|
|
Packit |
1c1d7e |
} else { // buffered file
|
|
Packit |
1c1d7e |
if ( (ch = getc( fh )) != EOF )
|
|
Packit |
1c1d7e |
ioIndex++;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
setStatus(IO_ReadError);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\fn int QFile::writeBlock( const QByteArray& data )
|
|
Packit |
1c1d7e |
\reimp
|
|
Packit |
1c1d7e |
\internal
|
|
Packit |
1c1d7e |
Should be removed in 3.0
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Writes the character \e ch to the file.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns \e ch, or -1 if some error occurred.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa getch(), ungetch()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QFile::putch( int ch )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // file not open
|
|
Packit |
1c1d7e |
qWarning( "QFile::putch: File not open" );
|
|
Packit |
1c1d7e |
return EOF;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isWritable() ) { // writing not permitted
|
|
Packit |
1c1d7e |
qWarning( "QFile::putch: Write operation not permitted" );
|
|
Packit |
1c1d7e |
return EOF;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( isRaw() ) { // raw file (inefficient)
|
|
Packit |
1c1d7e |
char buf[1];
|
|
Packit |
1c1d7e |
buf[0] = ch;
|
|
Packit |
1c1d7e |
ch = writeBlock( buf, 1 ) == 1 ? ch : EOF;
|
|
Packit |
1c1d7e |
} else { // buffered file
|
|
Packit |
1c1d7e |
if ( (ch = putc( ch, fh )) != EOF ) {
|
|
Packit |
1c1d7e |
ioIndex++;
|
|
Packit |
1c1d7e |
if ( ioIndex > length ) // update file length
|
|
Packit |
1c1d7e |
length = ioIndex;
|
|
Packit |
1c1d7e |
} else {
|
|
Packit |
1c1d7e |
setStatus(IO_WriteError);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Puts the character \e ch back into the file and decrements the index if it
|
|
Packit |
1c1d7e |
is not zero.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This function is normally called to "undo" a getch() operation.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
Returns \e ch, or -1 if some error occurred.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa getch(), putch()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
int QFile::ungetch( int ch )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
#if defined(CHECK_STATE)
|
|
Packit |
1c1d7e |
if ( !isOpen() ) { // file not open
|
|
Packit |
1c1d7e |
qWarning( "QFile::ungetch: File not open" );
|
|
Packit |
1c1d7e |
return EOF;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
if ( !isReadable() ) { // reading not permitted
|
|
Packit |
1c1d7e |
qWarning( "QFile::ungetch: Read operation not permitted" );
|
|
Packit |
1c1d7e |
return EOF;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
#endif
|
|
Packit |
1c1d7e |
if ( ch == EOF ) // cannot unget EOF
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( isSequentialAccess() && !fh) {
|
|
Packit |
1c1d7e |
// pipe or similar => we cannot ungetch, so do it manually
|
|
Packit |
1c1d7e |
ungetchBuffer +=ch;
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
if ( isRaw() ) { // raw file (very inefficient)
|
|
Packit |
1c1d7e |
char buf[1];
|
|
Packit |
1c1d7e |
at( ioIndex-1 );
|
|
Packit |
1c1d7e |
buf[0] = ch;
|
|
Packit |
1c1d7e |
if ( writeBlock(buf, 1) == 1 )
|
|
Packit |
1c1d7e |
at ( ioIndex-1 );
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
ch = EOF;
|
|
Packit |
1c1d7e |
} else { // buffered file
|
|
Packit |
1c1d7e |
if ( (ch = ungetc(ch, fh)) != EOF )
|
|
Packit |
1c1d7e |
ioIndex--;
|
|
Packit |
1c1d7e |
else
|
|
Packit |
1c1d7e |
setStatus( IO_ReadError );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
return ch;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QCString locale_encoder( const QString &fileName )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return fileName.local8Bit();
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QFile::EncoderFn encoder = locale_encoder;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
When you use QFile, QFileInfo, and QDir to access the filesystem
|
|
Packit |
1c1d7e |
with Qt, you can use Unicode filenames. On Unix, these filenames
|
|
Packit |
1c1d7e |
are converted to an 8-bit encoding. If you want to do your own
|
|
Packit |
1c1d7e |
file I/O on Unix, you should convert the filename using this
|
|
Packit |
1c1d7e |
function. On Windows NT, Unicode filenames are supported directly
|
|
Packit |
1c1d7e |
in the filesystem and this function should be avoided. On Windows 95,
|
|
Packit |
1c1d7e |
non-Latin1 locales are not supported at this time.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
By default, this function converts to the local 8-bit encoding
|
|
Packit |
1c1d7e |
determined by the user's locale. This is sufficient for
|
|
Packit |
1c1d7e |
filenames that the user chooses. Filenames hard-coded into the
|
|
Packit |
1c1d7e |
application should only use 7-bit ASCII filename characters.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
The conversion scheme can be changed using setEncodingFunction().
|
|
Packit |
1c1d7e |
This might be useful if you wish to give the user an option to
|
|
Packit |
1c1d7e |
store in filenames in UTF-8, etc., but beware that such filenames
|
|
Packit |
1c1d7e |
would probably then be unrecognizable when seen by other programs.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa decodeName()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
QCString QFile::encodeName( const QString &fileName )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return (*encoder)(fileName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\enum QFile::EncoderFn
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This is used by QFile::setEncodingFunction().
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Sets the function for encoding Unicode filenames.
|
|
Packit |
1c1d7e |
The default encodes in the locale-specific 8-bit encoding.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa encodeName()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
void QFile::setEncodingFunction( EncoderFn f )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
encoder = f;
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static
|
|
Packit |
1c1d7e |
QString locale_decoder( const QCString &localFileName )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return QString::fromLocal8Bit(localFileName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
static QFile::DecoderFn decoder = locale_decoder;
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
This does the reverse of QFile::encodeName().
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa setDecodingFunction()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
QString QFile::decodeName( const QCString &localFileName )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
return (*decoder)(localFileName);
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
\enum QFile::DecoderFn
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
This is used by QFile::setDecodingFunction().
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
/*!
|
|
Packit |
1c1d7e |
Sets the function for decoding 8-bit filenames.
|
|
Packit |
1c1d7e |
The default uses the locale-specific 8-bit encoding.
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
\sa encodeName(), decodeName()
|
|
Packit |
1c1d7e |
*/
|
|
Packit |
1c1d7e |
|
|
Packit |
1c1d7e |
void QFile::setDecodingFunction( DecoderFn f )
|
|
Packit |
1c1d7e |
{
|
|
Packit |
1c1d7e |
decoder = f;
|
|
Packit |
1c1d7e |
}
|