⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qfile_wce.cpp

📁 Trolltech公司发布的图形界面操作系统。可在qt-embedded-2.3.10平台上编译为嵌入式图形界面操作系统。
💻 CPP
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS.  All rights reserved.**** This file is part of the Qtopia Environment.** ** This program is free software; you can redistribute it and/or modify it** under the terms of the GNU General Public License as published by the** Free Software Foundation; either version 2 of the License, or (at your** option) any later version.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** This program is distributed in the hope that it will be useful, but** WITHOUT ANY WARRANTY; without even the implied warranty of** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. ** See the GNU General Public License for more details.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include "qplatformdefs.h"#include "qfile.h"#include "qfiledefs_p.h"#include <limits.h>bool qt_file_access( const QString& fn, int t ){    if ( fn.isEmpty() )	return FALSE;    return ::_waccess( (TCHAR*)fn.ucs2(), t) == 0;}bool isValidFile( const QString& fileName ){    // Only : needs to be checked for, other invalid characters    // are currently checked by fopen()    int findColon = fileName.findRev( ':' );    if ( findColon == -1 )	return TRUE;    else if ( findColon != 1 )	return FALSE;    else	return fileName[0].isLetter();}bool QFile::remove( const QString &fileName ){    if ( fileName.isEmpty() ) {#if defined(QT_CHECK_NULL)	qWarning( "QFile::remove: Empty or null file name" );#endif	return FALSE;    }    return ::_wremove( (TCHAR*)fileName.ucs2() ) == 0;}#define HAS_TEXT_FILEMODEbool QFile::open( int m ){    if ( isOpen() ) {				// file already open#if defined(QT_CHECK_STATE)	qWarning( "QFile::open: File already open" );#endif	return FALSE;    }    if ( fn.isNull() ) {			// no file name defined#if defined(QT_CHECK_NULL)	qWarning( "QFile::open: No file name specified" );#endif	return FALSE;    }    init();					// reset params    setMode( m );    if ( !(isReadable() || isWritable()) ) {#if defined(QT_CHECK_RANGE)	qWarning( "QFile::open: File access not specified" );#endif	return FALSE;    }    if ( !isValidFile( fn ) ) {	qWarning( "QFile::open: Invalid filename specified" );	return FALSE;    }    bool ok = TRUE;    if ( isRaw() ) {				// raw file I/O	int oflags = QT_OPEN_RDONLY;	if ( isReadable() && isWritable() )	    oflags = QT_OPEN_RDWR;	else if ( isWritable() )	    oflags = QT_OPEN_WRONLY;	if ( flags() & IO_Append ) {		// append to end of file?	    if ( flags() & IO_Truncate )		oflags |= (QT_OPEN_CREAT | QT_OPEN_TRUNC);	    else		oflags |= (QT_OPEN_APPEND | QT_OPEN_CREAT);	    setFlags( flags() | IO_WriteOnly ); // append implies write	} else if ( isWritable() ) {		// create/trunc if writable	    if ( flags() & IO_Truncate )		oflags |= (QT_OPEN_CREAT | QT_OPEN_TRUNC);	    else		oflags |= QT_OPEN_CREAT;	}#if defined(HAS_TEXT_FILEMODE)	if ( isTranslated() )	    oflags |= QT_OPEN_TEXT;	else	    oflags |= QT_OPEN_BINARY;#endif#if defined(HAS_ASYNC_FILEMODE)	if ( isAsynchronous() )	    oflags |= QT_OPEN_ASYNC;#endif	fd = ::_wopen( (TCHAR*)fn.ucs2(), oflags, 0666 );    } else {					// buffered file I/O	QCString perm;	char perm2[4];	bool try_create = FALSE;	if ( flags() & IO_Append ) {		// append to end of file?	    setFlags( flags() | IO_WriteOnly ); // append implies write	    perm = isReadable() ? "a+" : "a";	} else {	    if ( isReadWrite() ) {		if ( flags() & IO_Truncate ) {		    perm = "w+";		} else {		    perm = "r+";		    try_create = TRUE;		// try to create if not exists		}	    } else if ( isReadable() ) {		perm = "r";	    } else if ( isWritable() ) {		perm = "w";	    }	}	qstrcpy( perm2, perm );#if defined(HAS_TEXT_FILEMODE)	if ( isTranslated() )	    strcat( perm2, "t" );	else	    strcat( perm2, "b" );#endif	for (;;) { // At most twice	    TCHAR tperm2[4];	    tperm2[0] = perm2[0];	    tperm2[1] = perm2[1];	    tperm2[2] = perm2[2];	    tperm2[3] = perm2[3];	    fh = ::_wfopen( (TCHAR*)fn.ucs2(), tperm2 );	    if ( errno == EACCES )		break;	    if ( !fh && try_create ) {		perm2[0] = 'w';			// try "w+" instead of "r+"		try_create = FALSE;	    } else {		break;	    }	}    }    if ( (fh || fd) && !fn.isEmpty() ) { // open successful	QT_STATBUF st;	QT_TSTAT( (TCHAR*)fn.ucs2(), &st );	if ( (st.st_mode& QT_STAT_MASK) == QT_STAT_DIR ) {	    ok = FALSE;	} else {	    length = (int)st.st_size;	    ioIndex  = (flags() & IO_Append) == 0 ? 0 : length;	}    } else {	ok = FALSE;    }    if ( ok ) {	setState( IO_Open );    } else {	init();	if ( errno == EMFILE )			// no more file handles/descrs	    setStatus( IO_ResourceError );	else	    setStatus( IO_OpenError );    }    return ok;}bool QFile::open( int m, FILE *f ){    if ( isOpen() ) {#if defined(QT_CHECK_RANGE)	qWarning( "QFile::open: File already open" );#endif	return FALSE;    }    init();    setMode( m &~IO_Raw );    setState( IO_Open );    fh = f;    ext_f = TRUE;    QT_STATBUF st;    // ### Should be able to stat stdin, stdout, stderr    if ( !fn.isEmpty() )	QT_TSTAT( (TCHAR*)fn.ucs2(), (QT_STATBUF4TSTAT*)&st );    else 	qWarning( "Trying to stat file, without a filename!" );    ioIndex = (int)ftell( fh );    if ( (st.st_mode & QT_STAT_MASK) != QT_STAT_REG ) {	// non-seekable	setType( IO_Sequential );	length = INT_MAX;    } else {	length = (int)st.st_size;    }    return TRUE;}bool QFile::open( int m, int f ){    if ( isOpen() ) {#if defined(QT_CHECK_RANGE)	qWarning( "QFile::open: File already open" );#endif	return FALSE;    }    init();    setMode( m |IO_Raw );    setState( IO_Open );    fd = f;    ext_f = TRUE;    QT_STATBUF st;    // ### Should be able to stat stdin, stdout, stderr    if ( !fn.isEmpty() )	QT_TSTAT( (TCHAR*)fn.ucs2(), (QT_STATBUF4TSTAT*)&st );    else 	qWarning( "Trying to stat file, without a filename!" );    ioIndex  = (int)QT_LSEEK(fd, 0, SEEK_CUR);    if ( (st.st_mode & QT_STAT_MASK) != QT_STAT_REG ) {	// non-seekable	setType( IO_Sequential );	length = INT_MAX;    } else {	length = (int)st.st_size;    }    return TRUE;}QIODevice::Offset QFile::size() const{    QT_STATBUF st;    int ret = -1;    // ### Should be able to stat stdin, stdout, stderr    if ( !fn.isEmpty() )	ret = QT_TSTAT( (TCHAR*)fn.ucs2(), (QT_STATBUF4TSTAT*)&st );    else 	qWarning( "Trying to stat file, without a filename!" );    if ( ret == -1 )	return 0;    return st.st_size;}bool QFile::at( Offset pos ){    if ( !isOpen() ) {#if defined(QT_CHECK_STATE)	qWarning( "QFile::at: File is not open" );#endif	return FALSE;    }    bool okay;    if ( isRaw() ) {				// raw file	pos = (int)QT_LSEEK(fd, pos, SEEK_SET);	okay = pos != (Q_ULONG)-1;    } else {					// buffered file	okay = fseek(fh, pos, SEEK_SET) == 0;    }    if ( okay )	ioIndex = pos;#if defined(QT_CHECK_RANGE)    else	qWarning( "QFile::at: Cannot set file position %d", pos );#endif    return okay;}Q_LONG QFile::readBlock( char *p, Q_ULONG len ){#if defined(QT_CHECK_NULL)    if ( !p )	qWarning( "QFile::readBlock: Null pointer error" );#endif#if defined(QT_CHECK_STATE)    if ( !isOpen() ) {				// file not open	qWarning( "QFile::readBlock: File not open" );	return -1;    }    if ( !isReadable() ) {			// reading not permitted	qWarning( "QFile::readBlock: Read operation not permitted" );	return -1;    }#endif    Q_ULONG nread = 0;					// number of bytes read    if ( !ungetchBuffer.isEmpty() ) {	// need to add these to the returned string.	Q_ULONG l = ungetchBuffer.length();	while( nread < l ) {	    *p = ungetchBuffer[ int(l - nread - 1) ];	    p++;	    nread++;	}	ungetchBuffer.truncate( l - nread );    }    if( nread < len ) {	if ( isRaw() ) {				// raw file	    nread += QT_READ( fd, p, len - nread );	    if ( len && nread <= 0 ) {		nread = 0;		setStatus(IO_ReadError);	    }	} else {					// buffered file	    nread += fread( p, 1, len - nread, fh );	    if ( (uint)nread != len ) {		if ( ferror( fh ) || nread==0 )		    setStatus(IO_ReadError);	    }	}    }    ioIndex += nread;    return nread;}Q_LONG QFile::writeBlock( const char *p, Q_ULONG len ){#if defined(QT_CHECK_NULL)    if ( p == 0 && len != 0 )	qWarning( "QFile::writeBlock: Null pointer error" );#endif#if defined(QT_CHECK_STATE)    if ( !isOpen() ) {				// file not open	qWarning( "QFile::writeBlock: File not open" );	return -1;    }    if ( !isWritable() ) {			// writing not permitted	qWarning( "QFile::writeBlock: Write operation not permitted" );	return -1;    }#endif    Q_ULONG nwritten;				// number of bytes written    if ( isRaw() )				// raw file	nwritten = QT_WRITE( fd, p, len );    else					// buffered file	nwritten = fwrite( p, 1, len, fh );    if ( nwritten != len ) {		// write error	if ( errno == ENOSPC )			// disk is full	    setStatus( IO_ResourceError );	else	    setStatus( IO_WriteError );	if ( isRaw() )				// recalc file position	    ioIndex = (int)QT_LSEEK( fd, 0, SEEK_CUR );	else	    ioIndex = fseek( fh, 0, SEEK_CUR );    } else {	ioIndex += nwritten;    }    if ( ioIndex > length )			// update file length	length = ioIndex;    return nwritten;}int QFile::handle() const{    if ( !isOpen() )	return -1;    else if ( fh )	return (int)fh;    else	return fd;}void QFile::close(){    bool ok = FALSE;    if ( isOpen() ) {				// file is not open	if ( fh ) {				// buffered file	    if ( ext_f )		ok = fflush( fh ) != -1;	// flush instead of closing	    else		ok = fclose( fh ) != -1;	} else {				// raw file	    if ( ext_f )		ok = TRUE;			// cannot close	    else		ok = QT_CLOSE( fd ) != -1;	}	init();					// restore internal state    }    if (!ok)	setStatus (IO_UnspecifiedError);    return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -