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

📄 filemanager.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.************************************************************************/#define QTOPIA_INTERNAL_FILEOPERATIONS#include "filemanager.h"#include "applnk.h"#include "global.h"#include <qdir.h>#include <qfile.h>#include <qfileinfo.h>#include <qtextstream.h>#include <qtextcodec.h>#include <errno.h>#include <stdlib.h>// defined in applnk.cppbool mkdirRecursive( QString path );/*!  \class FileManager  \brief The FileManager class assists with AppLnk input/output.  The FileManager class is used to \l{loadFile()}s and  \l{saveFile()}s. It also provides a copyFile() function and a  function to test for a file's existence, exists(). It also provides  openFile() that provides an IO device for reading.  \ingroup qtopiaemb*//*!  Constructs a FileManager object.*/FileManager::FileManager(){}/*!  Destroys the FileManager object.*/FileManager::~FileManager(){}/*!  \overload  Saves \a data as the document specified by \a f.  Returns TRUE if the operation succeeded; otherwise returns FALSE.*/bool FileManager::saveFile( const DocLnk &f, const QByteArray &data ){    QString fn = qtopia_tempName( f.file() );    ensurePathExists( fn );    QFile fl( fn );    if ( !fl.open( IO_WriteOnly|IO_Raw ) )	return FALSE;    int total_written = fl.writeBlock( data );    fl.close();    if ( total_written != int(data.size()) || !f.writeLink() ) {	QFile::remove( fn );	return FALSE;    }    qtopia_renameFile( fn, f.file() );    return TRUE;}/*!  Saves \a text as the document specified by \a f.  The text is saved in UTF8 format.  Returns TRUE if the operation succeeded; otherwise returns FALSE.*/bool FileManager::saveFile( const DocLnk &f, const QString &text ){    QString fn = qtopia_tempName( f.file() );    ensurePathExists( fn );    QFile fl( fn );    if ( !fl.open( IO_WriteOnly|IO_Raw ) ) {	qDebug( "open failed: %s", fn.latin1() );	return FALSE;    }    QCString cstr = text.utf8();    int total_written;    total_written = fl.writeBlock( cstr.data(), cstr.length() );    fl.close();    if ( total_written != int(cstr.length()) || !f.writeLink() ) {	QFile::remove( fn );	return FALSE;    }    // okay now rename the file...    qtopia_renameFile( fn, f.file() );    return TRUE;}/*!  \overload  Loads \a text from the document specified by \a f.  The text must be in UTF8 format.  Returns TRUE if the operation succeeded; otherwise returns FALSE.*/bool FileManager::loadFile( const DocLnk &f, QString &text ){    QString fn = f.file();    QFile fl( fn );    if ( !fl.open( IO_ReadOnly ) )	return FALSE;    QTextStream ts( &fl );#if QT_VERSION <= 230 && defined(QT_NO_CODECS)    // The below should work, but doesn't in Qt 2.3.0    ts.setCodec( QTextCodec::codecForMib( 106 ) );#else    ts.setEncoding( QTextStream::UnicodeUTF8 );#endif    text = ts.read();    fl.close();    return TRUE;}/*!  Loads \a ba from the document specified by \a f.  Returns TRUE if the operation succeeded; otherwise returns FALSE.*/bool FileManager::loadFile( const DocLnk &f, QByteArray &ba ){    QString fn = f.file();    QFile fl( fn );    if ( !fl.open( IO_ReadOnly ) )	return FALSE;    ba.resize( fl.size() );    if ( fl.size() > 0 )	fl.readBlock( ba.data(), fl.size() );    fl.close();    return TRUE;}/*!  Copies the document specified by \a src to the document specified  by \a dest.  Returns TRUE if the operation succeeded; otherwise returns FALSE.*/bool FileManager::copyFile( const AppLnk &src, const AppLnk &dest ){    QFile sf( src.file() );    if ( !sf.open( IO_ReadOnly ) )	return FALSE;    QString fn = qtopia_tempName( dest.file() );    ensurePathExists( fn );    QFile df( fn );    if ( !df.open( IO_WriteOnly|IO_Raw ) )	return FALSE;    const int bufsize = 16384;    char buffer[bufsize];    bool ok = TRUE;    int bytesRead = 0;    while ( ok && !sf.atEnd() ) {	bytesRead = sf.readBlock( buffer, bufsize );	if ( bytesRead < 0 )	    ok = FALSE;	while ( ok && bytesRead > 0 ) {	    int bytesWritten = df.writeBlock( buffer, bytesRead );	    if ( bytesWritten < 0 )		ok = FALSE;	    else		bytesRead -= bytesWritten;	}    }    if ( ok )	ok = dest.writeLink();    if ( ok )	qtopia_renameFile( fn, dest.file() );    return ok;}/*!  Opens the document specified by \a f as a readable QIODevice.  The caller must delete the return value.  Returns 0 if the operation fails.*/QIODevice* FileManager::openFile( const DocLnk& f ){    QString fn = f.file();    QFile* fl = new QFile( fn );    if ( !fl->open( IO_ReadOnly ) ) {	delete fl;        fl = 0;    }    return fl;}/*!  \overload  Opens the document specified by \a f as a writable QIODevice.  The caller must delete the return value.  Returns 0 if the operation fails.*/QIODevice* FileManager::saveFile( const DocLnk& f ){    QString fn = f.file();    ensurePathExists( fn );    QFile* fl = new QFile( fn );    if ( fl->open( IO_WriteOnly ) ) {	f.writeLink();    } else {	delete fl;        fl = 0;    }    return fl;}/*!  Returns TRUE if the document specified by \a f current exists  as a file on disk; otherwise returns FALSE.*/bool FileManager::exists( const DocLnk &f ){    return QFile::exists(f.file());}/*!  Ensures that the path \a fn exists, by creating required directories.  Returns TRUE if it succeededs; otherwise returns FALSE.*/bool FileManager::ensurePathExists( const QString &fn ){    QFileInfo fi(fn);    if (!fi.isDir()){      fi = QFileInfo(fi.dirPath(TRUE));    }    QString dirPath = fi.absFilePath();    if ( !fi.exists() ) {#ifndef Q_OS_WIN32	// May need to create directories	QString cmdLine(QString("mkdir -p ") + dirPath.latin1());	if ( system(cmdLine.latin1())){#else	if ( !mkdirRecursive( dirPath ) ) {#endif	     qDebug("FileManager::ensurePathExists : System failed to create directory path %s", dirPath.latin1());	     return FALSE;	}    }    return TRUE;}

⌨️ 快捷键说明

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