14.QT-QFile文件,QBuffer缓冲区,QDir目录,QFileSystemWatcher文件系统监视
QFile
Qt中所有与IO相关的类都继承于QIODevice,继承图如下所示:

其中QFile类便是用于文件操作的类
在QT中,将文件当做一种特殊的外部设备对待(比如:串口,usb等就是外部设备)
QT中,IO操作相关的函数接口,常用以下几种
打开设备
bool open(OpenMode mode); //打开文件成功返回true,否则返回false
// mode有:
// QIODevice::ReadOnly 、QIODevice::WriteOnly、QIODevice::ReadWrite
// QIODevice::Append :写入的数据将会写在文件末尾
// QIODevice::Truncate :打开文件后,之前的内容将会消失(默认Truncate是打开的)
//QIODevice::Text:以文本方式写入(若写"\n",在win平台上则自动被翻译为"\r\n"),否则以数据方式写入(写入的是字节)
读取数据
QByteArray read(qint64 maxSize) //从设备读取最多maxSize字节的数据 , QByteArray 类可以默认转换为QString类
QByteArray readAll(); //读出所有数据
qint64 readData ( char * data, qint64 maxSize ); //读出最多maxSize字节的数据,送到char * data里, 并返回成功写入的字节数,失败则返回-1
QByteArray QIODevice::readLine ( qint64 maxSize = ); //读出一行数据
写入数据
qint64 write(const QByteArray & byteArray) //将byteArray写入设备,返回成功写入的字节数,失败则返回-1
qint64 writeData ( const char * data, qint64 len );
//从char * data里写入最多len字节的数据到设备, 并返回成功写入的字节数,失败则返回-1
关闭设备
void close();
- IO操作的本质是读写连续的存储空间数据
QT中,存取IO设备分为两种
-顺序存取设备(比如:串口)
只能从头开始顺序的读写数据,不能指定数据的读写位置
-随机存取设备(比如:文件)
可以随机定位到任意位置,进行数据读写,通过seek()函数实现
QFile文本文件操作示例
在Qt中,一个QFile对象便对应着一个文件
  QFile file file("C:/Users/Administrator/Desktop/test.txt");   //创建文件对象
         /*写数据*/
    if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
    {
        file.write("D.T.Software\n");
        file.write("Delphi Tang\n");
        file.close();
    }
        /*读数据*/
    if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        QByteArray ba = file.readLine();
        QString s(ba);                //将字节数组转换为字符串
        qDebug() << s;
        file.close();
    }
QFileInfo类(获取文件属性信息)
示例:
    QFile  file("C:/Users/Administrator/Desktop/test.txt");
    QFileInfo info(file);  
    qDebug() << info.exists();            //判断文件是否存在
    qDebug() << info.isFile();            //判断这个路径是文件,还是文件夹
    qDebug() << info.isReadable();        //该文件是否可读
    qDebug() << info.isWritable();        //该文件是否可写
    qDebug() << info.created();           //返回创建该文件的时间
    qDebug() << info.lastRead();          //返回最后访问文件的时间
    qDebug() << info.lastModified();      //返回最后修改文件的时间
    qDebug() << info.absolutePath();      //返回该文件的目录绝对路径
    qDebug() << info.fileName();          //返回该文件名称
    qDebug() << info.suffix();            //返回该文件后缀
    qDebug() << info.size();              //返回文件大小
    qDebug() << info.absoluteFilePath();  //返回该绝对路径
打印:
true
true
true
true
QDateTime("周三 五月 2 09:01:04 2018")
QDateTime("周三 五月 2 09:01:04 2018")
QDateTime("周三 五月 2 09:02:33 2018")
"C:/Users/Administrator/Desktop"
"test.txt"
"txt" "C:/Users/Administrator/Desktop/test.txt"
QFile数据文件操作示例:
由于write和read函数只能支持char参数,如果填入数值型或QSTring型时,则需要转换:
QString str="哈哈达";
QFile file("C:/Users/Administrator/Desktop/test.hex"); /*写数据*/
if( file.open( QIODevice::WriteOnly ) )
{
double i=3.1412;
file.write(str.toStdString().c_str()); //QString->string->char
file.write(reinterpret_cast<char *>(&i),sizeof(i)); //写入8字节数据(数值)
file.close();
} /*读数据*/
if( file.open(QIODevice::ReadOnly) )
{
QString s = file.read(str.toStdString().length());
qDebug() << s; double value;
file.read(reinterpret_cast<char *>(&value),sizeof(value)); //读出double
qDebug() << value; file.close();
}
这样转换会显得非常麻烦,所以QT提供了辅助类来简化文本文件/数据文件的读写
QTextStream、QDataStream辅助类
QTextStream
将写入的数据全部转换为可读文本(适用于文本文件)
QDataStream
将写入的数据根据类型转换为二进制数据(适用于数据文件)
注意
QDataStream在不同版本中,数据格式可能不同,所以数据文件如果要在不同版本QT程序间传递,还需要考虑版本问题:
void setVersion(int v); //设置读写版本号,比如4.7版本,则填入: QDataStream::Qt_4_7
int version(); //获取读写版本号
QTextStream使用示例
    QFile file("C:/Users/Administrator/Desktop/test.txt");
        
     /*写数据*/
    if( file.open( QIODevice::WriteOnly| QIODevice::Text ) )
    {
        QTextStream out(&file);                            //定义out对象,通过<<操作符向设备输出数据
        out << QString("D.T.Software ")<<endl ;             //将QString自动转为字符
        out << QString("哈哈达") << endl;
        out <<  << '*' <<  << '=' <<  *  << endl;   //将数值自动转为字符
        file.close();
    }
         /*读数据*/
    if( file.open(QIODevice::ReadOnly| QIODevice::Text) )
    {
        QTextStream in(&file);                   //定义in对象,通过>>操作符从设备读数据
        while( !in.atEnd() )
        {
            QString str;
            in>>str;
            qDebug()<<str;          //打印3次
        }
        file.close();
}
注意: endl其实只是加了\n,由于win平台的换行符是\r\n,所以需要加上QIODevice::Text,QT便会自动将\n转为\r\n.
QDataStream使用示例
    QFile file("C:/Users/Administrator/Desktop/test.txt");
    if( file.open(QIODevice::WriteOnly) )
    {
        QDataStream out(&file);
        out.setVersion(QDataStream::Qt_4_7);                            //设置版本
        out << QString("D.T.Software");
        out << QString("Result: ");
        out << 3.14;
        file.close();
    }
    if( file.open(QIODevice::ReadOnly) )
    {
        QDataStream in(&file);
        QString dt = "";
        QString result = "";
        double value = ;
        in.setVersion(QDataStream::Qt_4_7);                       ////设置版本
        in >> dt;
        in >> result;
        in >> value;
        qDebug() << dt;
        qDebug() << result;
        qDebug() << value;
        file.close();
    }
QBuffer缓冲区
缓冲区的本质为一段连续的存储空间
- 缓存区分为内部和外部,外部设备便表示外部缓冲区,而 QBuffer类则表示计算机的内部缓冲区
- 在Qt中可以将缓冲区看作一种特殊的IO设备
- QTextStream,QDataStream文件流辅助类也可以直接用于操作缓冲区
QBuffer缓冲区的使用场合
- 通过进程间共享缓冲区,实现线程间不同类型的数据传递
- 可以缓冲外部设备的读写数据,比如串口数据
- 当数据读取速度小于写入速度时
QBuffer使用方法:
QByteArray array;
QBuffer buffer(&array); if(buffer.open(QIODevice::WriteOnly))
{
QDataStream out(&buffer); out << QString("3.1234");
out << QString("scorpio");
out << QString("");
out << 1.34; buffer.close();
} if(buffer.open(QIODevice::ReadOnly))
{
QDataStream in(&buffer);
QString name;
QString a;
QString b;
double num; in >> a;
in >> name;
in >> b;
in >> num; qDebug() << name;
qDebug() << a;
qDebug() << b;
qDebug() <<num; buffer.close();
}
QDir目录
QT中提供了目录操作类QDir,QDir功能如下:
- 目录分隔符统一使用’/’
- 能够对目录进行任意操作(创建、删除、重命名)
- 能够获取指定目录中的所有条目(文件和文件夹)
- 能够使用过滤字符串获取指定条目
- 能够获取系统中的所有根目录
QDir使用方法如下:
QDir dir;
QString path = ("C:/Users/Administrator/Desktop/QDir");
if(!dir.exists(path))
{
  dir.mkdir(path);
}
else
{
  dir.cd(path);
  QStringList filters;                                  //字符串列表,用来筛选文件条目
  filters << "*.bmp" << "*.png";
  QStringList list = dir.entryList(filters,QDir::NoDotAndDotDot|QDir::AllEntries);
     // QDir::NoDotAndDotDot:不要出现.和..两个条目, QDir::AllEntries:所有(文件,目录等) 
  for(int i = ; i < list.count(); i++)
  {
     qDebug() << list[i];
  }
}
来个示例,写个函数用来读取当前目录/或者文件的大小:
int Calculate_Size(QString PATH)
{
int size=; QFileInfo file(PATH);
if(file.isFile())
{
return file.size();
} else if(file.isDir())
{
QDir dir(PATH);
QFileInfoList files = dir.entryInfoList(QDir::NoDotAndDotDot|QDir::AllEntries);
qDebug()<<files.length();
for(int i=;i<files.length();i++)
{
qDebug()<<files[i].absoluteFilePath();
size+=Calculate_Size(files[i].absoluteFilePath()); //递归地查找
}
} return size;
}
QFileSystemWatcher文件系统监视
用来监控目录或文件的状态变化
- 能够同时对多个目录/文件进行监控
- 当目录或文件发生改变时,将会触发信号
- 可以通过信号与槽的机制捕捉信号,并做出响应
QFileSystemWatcher信号函数如下所示:
void directoryChanged ( const QString & path );
//当指定的目录被修改(例如该目录里一个文件被添加、修改或删除或从磁盘删除时),这个信号就会发出。 void ileChanged ( const QString & path );
//当指定的文件被修改、重命名或从磁盘删除时,就会发出这个信号
示例
QFsWatcher.h:
#ifndef QFSWATCHER_H
#define QFSWATCHER_H
#include <QObject>
#include <QFileSystemWatcher>
#include <QDebug> class QFsWatcher : public QObject
{
Q_OBJECT private :
QFileSystemWatcher fs; private slots:
void Dir_status( const QString & path );
void File_status( const QString & path ); public:
explicit QFsWatcher(QObject *parent = );
void addPath(const QString & path); }; #endif // QFSWATCHER_H
QFsWatcher.cpp:
#include "QFsWatcher.h" QFsWatcher::QFsWatcher(QObject *parent) :
QObject(parent)
{
connect(&fs,SIGNAL(directoryChanged(const QString&)),this,SLOT(Dir_status(const QString&)) );
connect(&fs,SIGNAL(fileChanged(const QString&)),this,SLOT(File_status(const QString&)) );
} void QFsWatcher::Dir_status( const QString & path )
{
qDebug()<<path<<": is Changed!";
} void QFsWatcher::File_status( const QString & path )
{
qDebug()<<path<<": is Changed!";
} void QFsWatcher::addPath(const QString & path)
{
fs.addPath(path);
}
main.cpp:
#include <QtCore/QCoreApplication>
#include "QFsWatcher.h" int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QFsWatcher watcher; watcher.addPath("C:/Users/Administrator/Desktop/QDir"); //监视QDir目录
watcher.addPath("C:/Users/Administrator/Desktop/text.txt"); //监视text.txt文件 return a.exec();
}
效果:

14.QT-QFile文件,QBuffer缓冲区,QDir目录,QFileSystemWatcher文件系统监视的更多相关文章
- Qt QFile文件读写
		QFile 需要添加 #Include <QFile> 集成至QIODevice 打开一个文件有3种方式QIODevice::(ReadOnly/WriteOnly/ReadWrite) ... 
- Qt之文件操作 QFile
		原地址:http://blog.csdn.net/liuhongwei123888/article/details/6084761 今天学习QT的文件操作 1.QIODevice直接继承自QObjec ... 
- QIODevice (Qt中所有 I/O devices 的基类,QFile,QBuffer,QTcpSocket等)
		QIODevice是所有Qt I/O设备的基类,它提供了对支持块读写设备(例如QFile,QBuffer,QTcpSocket)的通用实现和抽象接口.QIODevice是一种抽象,不能被实例化,但是, ... 
- 界面编程之QT的文件操作20180729
		/*******************************************************************************************/ 一.QT文件 ... 
- QT 读取文件夹下所有文件(超级简单的方法,不需要QDirIterator)
		之前,用标准C++写过读取文件夹.现在用QT重写代码,顺便看了下QT如何实现,还是相当简单的.主要用到QDir,详细文档可见这里 A program that lists all the files ... 
- QT学习笔记8:QDir类及其用法总结
		简介 QDir类提供了访问系统目录结构及其内容的与平台无关的方式. 头文件:#include <qdir.h> QDir类用来操作路径名及底层文件系统,获取关于目录路径及文件的相关信息,也 ... 
- [转] 解析Qt资源文件使用
		解析Qt资源文件使用 转自:http://mobile.51cto.com/symbian-270121.htm 本文详细的介绍了Qt文件的使用,和大部分GUI框架设计工具一样,Qt也引入了资源文件系 ... 
- qt的资源替换搜索QDir具体解释
		QDir对跨平台的文件夹操作提供了非常多的便利,为了更加方便的提供全局资源的查找,QDir提供了搜索路径替换功能,攻克了资源搜索不便的问题,也能提高文件查找的效率. QDir通过已知的路径前缀去搜索并 ... 
- Qt工程文件说明
		Qt工程文件说明 2017-10-16 天天快乐6... 转自 LZS2851 修改 微信 分享: 这篇文章是我从360doc上转的,本来是要把转的url列出来的,但是它们居然禁掉了复制,而且 ... 
随机推荐
- Android JavascriptBridge 详解(二)
			原文出自:http://blog.csdn.net/sk719887916/article/details/47189607 Android开发目前现状来说,开发者大部分时间花在UI的屏幕适配上,使用 ... 
- 6.3、Android Studio的CPU Monitor
			Android Monitor包含一个CPU Monitor,可以让你非常方便的监测你的应用的CPU的使用.它显示试试的CPU使用. 在CPU Monitor显示正在运行的应用 1. 打开一个项目 2 ... 
- Cocos2D创建多彩文本显示标签
			大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) Cocos2D中默认的CCLableTTF类从源代码里看是支持 ... 
- Linux系统编程----孤儿进程
			什么是孤儿进程? 孤儿进程, 指在父进程退出后,而子进程还在运行,这个子进程就成了孤儿进程,这时由init进程(pid=1)接管 来看看例子: #include <stdio.h> #i ... 
- (一)SQLite与SQL语句基础
			数据库一般分为 关系型和对象型,关系型是主流,对象型数据库是直接把对象存入数据库. 常用关系型数据库: PC:Oracle MySQL SQL Server DB2 嵌入式/移动端:SQLite 本文 ... 
- 卸载linux后出现grub rescue怎么办?
			原文转自:http://zhidao.baidu.com/link?url=9e2mOttgV0IJDMml58SFbV-7XOvVzp2jR5l1n3ltFOzX1XAcp5-t-QQPc-Nozy ... 
- Android对话框AlertDialog-android学习之旅(四十二)
			对话框简介 android提供了丰富的对话框支持,支持四种如下的对话框. AlertDialog简介 介绍上面六个方法的代码示例 setMessage() <?xml version=" ... 
- 学习笔记-JS公开课一
			JS公开课笔记 没特别说明就是和Java语言一样. JS变量:弱类型语言 1.在JS中,true表示1,false表示0.和Java不一样. 2. var y: 提示undefined: 3.如果al ... 
- Android学习之Animation(三)
			今天观看了一个关于android动画的一些知识,就顺便记录下来,以备之后的学习和参考. 在XML文件中使用LayoutAnimationController 第一步: 在res/anim文件夹下创建一 ... 
- APACHE,NGINX 详细分析
			Apache是目前最流行的Web应用服务器,占据了互联网应用服务器70%以上的份额.Apache能取得如此成功并不足为奇:它免费.稳定且性能卓越:但Apache能取得如此佳绩的另一个原因是,当时互联网 ... 
