Qt 文件处理详细讲解教程 下篇

移动开发
本文介绍的是Qt 文件处理的内容,有读写文本类、操作二进制类、QTemporaryFile临时类,等一些常用的类的介绍。

接着我我们上一篇内容讲,Qt 文件处理详细讲解教程 上篇。主要介绍了目录操作和文件的管理、监视文件系统的变化、 文件引擎一些知识。

目录操作和文件管理

QDir类具有存取目录结构和内容的能力。使用QDir可以操作目录,存取目录或文件信息,操作底层文件系统,而且还可以存取Qt的资源文件Qt使用/作为通用的目录分割符和URL路径分隔符。Qt可以使用相对路径和绝对路径指向一个文件,isRelative()和isAbsolute()函数可以判断QDir对象使用的是相对路径还是绝对路径。将相对路径转换为绝对路径使用makeAbsolute()函数。目录路径可以通过path()函数返回,通过setPath()函数设置新路径,绝对路径使用absolutePath()返回。

目录名可以使用dirName()返回。目录的路径可以通过cd() cdUp()改变,可以使用mkdir()创建目录,rename()改变目录名。判断目录是否存在可以使用exists(),目录的属性可以使用 isReadable(),isAbsolute(),isRelative()和isRoot()来获取,目录下有很多条目,包括文件,目录和符号链接,总的条目数可以使用count()来统计。entryList()可以返回目录下所有条目组成的字符串链表,文件可以使用remove()函数删除,rmdir()删除目录。

linux du命令

  1. int main(int argc, char **argv)  
  2. {  
  3.    QCoreApplication app(argc,argv);  
  4.    QStringList args=app.arguments();  
  5.    QString path;  
  6.    if(args.count()>1)  
  7.      path=args[1];  
  8.    else  
  9.      path=QDir::currentPath();  
  10.    qDebug()<    du(path);  
  11.    return 0;  
  12. }  
  13. qint64 du(const QString &path)  
  14. {  
  15.     QDir dir(path);  
  16.     qint64 size=0;  
  17.     foreach(QFileInfo fileInfo,dir.entryInfoList(QDir::Files))  
  18.        size+=fileInfo.size();  
  19.     foreach(QString subDir,dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))  
  20.        size+=du(path+Dir::separator()+subDir);  
  21.     char unit=\\\'B\\\';  
  22.     if(curSize>1024)  
  23.     {  
  24.        curSize/=1024;  
  25.        unit=\\\'K\\\';  
  26.        if(curSize>1024)  
  27.        {  
  28.           curSize/=1024;  
  29.           unit=\\\'M\\\';  
  30.           if(curSize>1024)  
  31.           {  
  32.             curSize/=1024;  
  33.             unit=\\\'G\\\';  
  34.           }  
  35.         }  
  36.      }  
  37.      cout<      return size;  

函数du()中,entryInfoList(QDir::Files)函数返回文件信息,然后根据这些信息计算文件大小,接下来判断是否有子目录,如果有则递归计算。dir.etnryList(QDir::Dirs|QDir::NoDotAndDotDot)返回所有子目录并过滤掉. .. 目录。由于windows(),linux平台/ \差异,使用QDir::separator()函数来返回特定平台的目录分隔符。另外QDirIterator可以完成

枚举目录的功能,Qt4.3还引入了文件搜索前缀的概念,文件搜索前缀时至少由两个字符组成,用来搜索指定文件的路径。

  1. QDir::setSearchPaths("docs",QStringList("c:\My Docments"));  
  2. QDir::addSearchPaht("Docs",QStringList("D:|Documents"));  
  3. QFile file("docs::qt4.doc"); 

这样就可以在两个目录中查找。

文件管理

QFileInfo类提供了与系统无关的文件信心,它能提供文明名和路径,存取权限,以及文件是否为目录或符号链接,文件大小,以及***修改/读取的时间等。

QFileInfo也能从资源中获取信息。QFileInfo可以使用相对路径或绝对路径。文件名可以在QFileInfo的构造函数中传递,也可以使用setFile()函数指定,要判断一个函数是否存在,使用exits()函数,文件大小可以通过size()函数获取,文件类型可以通过isFile(),isDir(),isSymLink()来获取,symLinkTarget()函数返回符号链接所指向的真正文件名。QFileInfo提供refresh函数刷新文件信息,如果需要QFileInfo每次从文件系统读取信息,二不是从缓存读取,可以使用setCaching(false)关闭缓存。

文件名和目录可以通过path()和fileName()分解,fileName()返回的部分可以通过baseName()和extension()来获得主文件名和扩展文件名,文件的操作日期可以通过created(),lastModified()和lastRead()获取,文件的存取权限可通国isReadable,isWriteable(),isExcutetable()获取,文件的属主可以通过owner(),ownerId,group(),groupId()获取,文件的权限和属主也可以通过 permission()一起读取。

监视文件系统的变化

在Qt中可以使用QFileSystemWatcher类来监视文件和目录的改变.使用addPath()函数来监视指定的文件和目录,如果需要监视多个目录,使用addPaths()来加入监视,如果要一处不需要监视的目录,可以使用removePath(),removePaths()函数.当监视的文件被修改或删除时,产生一个fileChanged()信号,如果被监视的目录被修改或删除,产生directoryChanged()信号,下例实现了监视指定目录的功能.

  1. #include  
  2. #include  
  3. #include  
  4. #Include"Msg.h"  
  5. using namespace std;  
  6. int main(int argc,char **argv)  
  7. {  
  8.     QApplication app(argc,argv);  
  9.     QTextCodec::setCodecForTr(QTextCodec::codecForLocale())  
  10.       
  11.     Msg msg;  
  12.     msg.show();  
  13.     return app.exec();  
  14. }  
  15. Msg::Msg()  
  16. {  
  17.    QFont font;  
  18.    font.setPointSize(24);  
  19.    setFont(font);  
  20.    QStringList args=qApp->arguments();  
  21.    QString path;  
  22.    if(args.count()>1)  
  23.      path=args[1];  
  24.    else  
  25.      path=QDir::currentPath();  
  26.    label=new QLabel();  
  27.    label->setText(tr("监视的目录:")+path);  
  28.      
  29.    QVBoxLayout *layout=new QVBoxLayout;  
  30.    layout->addWidget(label);  
  31.    setLayout(layout);  
  32.      
  33.    fsWatcher.addPath(path);  
  34.    connect(&fsWatcher,SIGNAL(directoryChanged(QString)),this,SLOT(directoryChanged(QString)));  

在构造函数中读取命令指定的目录作为监视目录,如果没有指定则监视当前目录,使用connect()函数将目录的directroyChanged()信号和响应函数连接.

  1. void Msg::directoryChanged(QString path)  
  2. {  
  3.     QMessageBox::information(NULL,tr("目录变化"),path);  

文件引擎

Qt的QtDir,QFile,QFileInfo在内部都使用一个,QAbstractFileEngine.通过继承QAbstractFileEngine,可以编写自己的文件处理函数,然后继承QAbstractFileEngineHander注册自己的文件引擎,然后这样就可以使用自己的文件读取引擎了.QAbstractFileEngineHandler是创建QAbstractFileEngine的类工厂.当打开一个文件时,Qt通过内部注册的文件引擎链表,选择合适的文件引擎并创建相应的引擎对象.为了安装一个特定的文件引擎,必须继承QAbstractFileEngineHandler并实现create()函数.实例化引擎时Qt自动注册该引擎,***注册的引擎比之前注册的优先级高.

如果想读取tar文件的引擎,可以从QAbstractFileEngineHandler继承

  1. class TarEngineHandler:public QAbstractFileEngineHandler  
  2. {  
  3.     public:  
  4.         QAbstractFileEngine *create(const QString &fileName) const;  
  5. };  
  6. create()函数返回TarEngine对象,TarEngine是文件引擎,时真正的文件处理类.  
  7. QAbstractFileEngine *TarEngineHandler::create(const QString &fileName) const  
  8. {  
  9.     return fileName.toLower().endsWith(".tar")?new TarEngine(fileName):0;  

小结:Qt 文件处理的内容介绍完了,希望本篇对你有帮助,以后有好的文章,一定与大家分享!敬请留言。

责任编辑:zhaolei 来源: 互联网
相关推荐

2011-06-17 13:18:17

Qt 文件

2011-07-01 14:20:59

Qt 事件

2011-07-04 10:33:22

QT

2011-07-06 10:32:07

Xcode

2011-07-06 10:46:33

Xcode

2011-06-17 09:58:26

Qt Chapter QObject

2011-06-17 10:19:11

Qt QWidge QSetting

2023-03-17 08:11:25

2011-06-17 09:34:02

Qt 4.5.1 Sqlite 移植

2011-04-07 17:43:37

Shapping

2011-07-04 17:26:00

Qt SQLite

2011-04-07 17:54:22

Policing

2011-06-22 14:47:51

QT 多线程 QObject

2011-07-05 18:40:19

QT 信号 机制

2011-06-23 18:16:59

Qt Qtopia

2011-06-17 17:16:01

Qt Eclipse Linux

2011-02-23 15:59:00

FileZilla

2009-12-18 16:18:15

Fedora proc

2010-02-23 14:17:20

WCF配置文件

2011-06-27 13:49:43

Qt 数据库 QSqlQueryM
点赞
收藏

51CTO技术栈公众号