1、第第9章章 Qt 5文件及磁盘处理文件及磁盘处理读写文本文件读写文本文件0101使用使用QFile类读写文本类读写文本使用使用QFile类读写文本类读写文本【例】【例】(简单)(CH901)建立基于控制台工程,使用QFile类读写文本文件。实现步骤如下。(1)建立一个工程。选择“文件”“新建文件或项目.”菜单项,在弹出的对话框中选择“项目”组下的“Application”“Qt Console Application”选项,单击“Choose.”按钮。(2)在弹出的对话框中对该工程进行命名并选择保存工程的路径,这里将工程命名为“TextFile”,单击“下一步”按钮,再次单击“下一步”按钮,最
2、后单击“完成”按钮,完成该文件工程的建立。使用使用QFile类读写文本类读写文本(3)源文件“main.cpp”的具体实现代码如下:#include#include#include int main(int argc,char*argv)QCoreApplication a(argc,argv);QFile file(textFile1.txt);/(a)if(file.open(QIODevice:ReadOnly)/(b)char buffer2048;qint64 lineLen=file.readLine(buffer,sizeof(buffer);/(c)if(lineLen!=-1
3、)/(d)qDebug()buffer;return a.exec();使用使用QFile类读写文本类读写文本其中,其中,(a)QFile file(textFile1.txt):打开一个文件有两种方式。一种方式是在构造函数中指定文件名;另一种方式是使用setFileName()函数设置文件名。(b)if(file.open(QIODevice:ReadOnly):打开文件使用open()函数,关闭文件使用close()函数。此处的open()函数以只读方式打开文件,只读方式参数为QIODevice:ReadOnly,只写方式参数为QIODevice:WriteOnly,读写参数为QIODev
4、ice:ReadWrite。(c)qint64 lineLen=file.readLine(buffer,sizeof(buffer):在QFile中可以使用从QIODevice中继承的readLine()函数读取文本文件的一行。(d)if(lineLen!=-1)qDebug()buffer;:如果读取成功,则readLine()函数返回实际读取的字节数;如果读取失败,则返回“-1”。使用使用QFile类读写文本类读写文本(4)选择“构建”“构建项目 TextFile”菜单项,首先编辑本例所用的文本文件“textFile1.txt”,保存在项目D:QtCH9CH901build-TextFi
5、le-Desktop_Qt_5_11_1_MinGW_32bit-Debug目录下,然后运行程序,运行结果如图9.1所示。0202使用使用QTextStream类读写文本类读写文本使用使用QTextStream类读写文本类读写文本【例】【例】(简单)(CH902)建立基于控制台的工程,使用QTextStream类读写文本文件。操作步骤与上节的实例类似,不再重复介绍。(1)源文件“main.cpp”的具体实现代码如下:#include#include#include int main(int argc,char*argv)QCoreApplication a(argc,argv);QFile d
6、ata(data.txt);if(data.open(QFile:WriteOnly|QFile:Truncate)/(a)QTextStream out(&data);outQObject:tr(score:)qSetFieldWidth(10)left90 endl;/(b)return a.exec();使用使用QTextStream类读写文本类读写文本其中,其中,(a)if(data.open(QFile:WriteOnly|QFile:Truncate):参数QFile:Truncate表示将原来文件中的内容清空。输出时将格式设为左对齐,占10个字符位置。(b)outQObject:
7、tr(score:)qSetFieldWidth(10)left90endl:用户使用格式化函数和流操作符设置需要的输出格式。其中,qSetFieldWidth()函数是设置字段宽度的格式化函数。除此之外,QTextStream还提供了其他一些格式化函数,见表9.1。函 数功 能 描 述qSetFieldWidth(int width)设置字段宽度qSetPadChar(QChar ch)设置填充字符qSetRealNumberPercision(int precision)设置实数精度使用使用QTextStream类读写文本类读写文本其中,其中,left操作符是QTextStream定义的类
8、似于中的流操作符。QTextStream还提供了其他一些流操作符,见表9.2。操 作 符作 用 描 述bin设置读写的整数为二进制数oct设置读写的整数为八进制数dec设置读写的整数为十进制数hex设置读写的整数为十六进制数showbase强制显示进制前缀,如十六进制(0 x)、八进制(0)、二进制(0b)forcesign强制显示符号(+,-)forcepoint强制显示小数点noshowbase不显示进制前缀noforcesign不显示符号uppercasebase显示大写的进制前缀lowercasebase显示小写的进制前缀uppercasedigits用大写字母表示lowercased
9、igits用小写字母表示fixed用固定小数点表示scientific用科学计数法表示left左对齐right右对齐center居中endl换行flush清除缓冲使用使用QTextStream类读写文本类读写文本(2)运行此程序后,可以看到在项目的D:QtCH9CH902build-TextFile2-Desktop_Qt_5_11_1_MinGW_32bit-Debug文件夹下自动建立了一个文本文件“data.txt”,打开后看到的内容如图9.2所示。第第9章章 Qt 5文件及磁盘处理文件及磁盘处理读写二进制文件读写二进制文件读写二进制文件读写二进制文件【例】【例】(简单)(CH903)使用
10、QDataStream读写二进制文件。(1)头文件“mainwindow.h”的具体代码如下:#include class MainWindow:public QMainWindow Q_OBJECTpublic:MainWindow(QWidget*parent=0);MainWindow();void fileFun();读写二进制文件读写二进制文件(2)源文件“mainwindow.cpp”的具体代码如下:#include mainwindow.h#include#include#include#include MainWindow:MainWindow(QWidget*parent):
11、QMainWindow(parent)fileFun();读写二进制文件读写二进制文件函数fileFun()完成主要功能,其具体代码如下:void MainWindow:fileFun()/*将二进制数据写到数据流*/(a)QFile file(binary.dat);file.open(QIODevice:WriteOnly|QIODevice:Truncate);QDataStream out(&file);/将数据序列化 out QString(tr(周何骏:);/字符串序列化 out QDate:fromString(1996/09/25,yyyy/MM/dd);out (qint32
12、)23;/整数序列化 file.close();/*从文件中读取数据*/(b)file.setFileName(binary.dat);if(!file.open(QIODevice:ReadOnly)qDebug()name birthday age;/获取字符串和整数 qDebug()name birthday age;file.close();读写二进制文件读写二进制文件其中,其中,(a)从从QFile file(binary.dat)到到file.close()之间的代码段:之间的代码段:每一个条目都以定义的二进制格式写入文件。Qt中的很多类型,包括QBrush、QColor、QDat
13、eTime、QFont、QPixmap、QString、QVariant等都可以写入数据流。QDataStream类写入了name(QString)、birthday(QDate)和age(qint32)这三个数据。注意,在读取时也要使用相同的类型读出。(b)从从file.setFileName(binary.dat)到到file.close()之间的代码段:之间的代码段:QDataStream类可以读取任意的以QIODevice为基类的类生成对象产生的数据,如QTcpSocket、QUdpSocket、QBuffer、QFile、QProcess等类的数据。可以使用QDataStream在Q
14、AbstractSocket一端写数据,在另一端使用QDataStream读取数据,这样就免去了烦琐的高低字节转换工作。读写二进制文件读写二进制文件(3)运行结果如图9.3所示。第第9章章 Qt 5文件及磁盘处理文件及磁盘处理目录操作与文件系统目录操作与文件系统0101文件大小及路径获取实例文件大小及路径获取实例文件大小及路径获取实例文件大小及路径获取实例【例】【例】(难度一般)(CH904)得到一个文件的大小和所在的目录路径。创建基于控制台的工程dirProcess.pro,前面已介绍过其建立步骤,这里不再赘述。源文件“main.cpp”的具体代码。运行结果如图9.4所示。本例项目编译后生成
15、的文件所在的目录是:D:/Qt/yuanshu/code/CH9/CH904/build-dirProcess-Desktop_Qt_5_11_1_MinGW_32bit-Debug该目录下debug文件夹大小为878KB,release文件夹大小为0B(空),编译生成的整个目录的总大小为952KB。0202文件系统浏览文件系统浏览文件系统浏览文件系统浏览【例】【例】(难度一般)(CH905)文件系统的浏览。创建工程FileView.pro,具体内容如下。(1)在头文件“fileview.h”中,类FileView继承自QDialog类,具体代码如下:#include#include#incl
16、ude#include#include#include#include class FileView:public QDialog Q_OBJECTpublic:FileView(QWidget*parent=0,Qt:WindowFlags f=0);FileView();void showFileInfoList(QFileInfoList list);public slots:void slotShow(QDir dir);void slotDirShow(QListWidgetItem*item);private:QLineEdit*fileLineEdit;QListWidget*f
17、ileListWidget;QVBoxLayout*mainLayout;文件系统浏览文件系统浏览(2)源文件“fileview.cpp”的具体代码如下:#include fileview.h#include#include FileView:FileView(QWidget*parent,Qt:WindowFlags f):QDialog(parent,f)setWindowTitle(tr(File View);fileLineEdit=new QLineEdit(tr(/);fileListWidget=new QListWidget;mainLayout=new QVBoxLayout
18、(this);mainLayout-addWidget(fileLineEdit);mainLayout-addWidget(fileListWidget);connect(fileLineEdit,SIGNAL(returnPressed(),this,SLOT(slotShow(QDir);connect(fileListWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*),this,SLOT(slotDirShow(QListWidgetItem*);QString root=/;QDir rootDir(root);QStringList
19、string;string *;QFileInfoList list=rootDir.entryInfoList(string);showFileInfoList(list);文件系统浏览文件系统浏览槽函数slotShow()实现了显示目录dir下的所有文件,具体内容如下:void FileView:slotShow(QDir dir)QStringList string;stringclear();/首先清空列表控件 for(unsigned int i=0;iaddItem(tmp);else if(tmpFileInfo.isFile()QIcon icon(file.png);QStr
20、ing fileName=tmpFileInfo.fileName();QListWidgetItem*tmp=new QListWidgetItem(icon,fileName);fileListWidget-addItem(tmp);文件系统浏览文件系统浏览槽函数slotDirShow()根据用户的选择显示下一级目录的所有文件。其具体实现代码如下:void FileView:slotDirShow(QListWidgetItem*item)QString str=item-text();/将下一级的目录名保存在str中 QDir dir;/定义一个QDir对象 dir.setPath(fi
21、leLineEdit-text();/设置QDir对象的路径为当前目录路径 dir.cd(str)/根据下一级目录名重新设置QDir对象的路径 fileLineEdit-setText(dir.absolutePath();/(a)slotShow(dir);/显示当前目录下的所有文件文件系统浏览文件系统浏览(3)运行结果如图9.5所示。第第9章章 Qt 5文件及磁盘处理文件及磁盘处理获取文件信息获取文件信息获取文件信息获取文件信息【例】(简单)(CH906)利用QFileInfo类获得文件信息,如图9.6所示。获取文件信息获取文件信息工程FileInfo.pro的具体内容如下。(1)在头文件
22、“fileinfo.h”中,类FileInfo继承自QDialog类,此类中声明了用到的各种相关控件和函数,其具体内容。(2)源文件“fileinfo.cpp”的具体内容。槽函数slotFile()完成通过标准文件对话框获得所需要文件的文件名功能,其具体内容如下:void FileInfo:slotFile()QString fileName=QFileDialog:getOpenFileName(this,打开,/,files(*);fileNameLineEdit-setText(fileName);槽函数slotGet()通过QFileInfo获得具体的文件信息,其具体内容。(3)运行结
23、果如图9.6所示。第第9章章 Qt 5文件及磁盘处理文件及磁盘处理监视文件和目录变化监视文件和目录变化监视文件和目录变化监视文件和目录变化【例】(简单)(CH907)监视指定目录功能,介绍如何使用QFileSystemWatcher。工程fileWatcher.pro的具体内容如下。(1)在头文件“watcher.h”中,Watcher类继承自QWidget类,其具体内容如下:#include#include#include class Watcher:public QWidget Q_OBJECTpublic:Watcher(QWidget*parent=0);Watcher();publi
24、c slots:void directoryChanged(QString path);private:QLabel*pathLabel;QFileSystemWatcher fsWatcher;监视文件和目录变化监视文件和目录变化(2)源文件“watcher.cpp”的具体内容如下:#include watcher.h#include#include#include#include Watcher:Watcher(QWidget*parent):QWidget(parent)QStringList args=qApp-arguments();QString path;if(args.coun
25、t()1)/(a)path=args1;else path=QDir:currentPath();pathLabel=new QLabel;pathLabel-setText(tr(监视的目录:)+path);QVBoxLayout*mainLayout=new QVBoxLayout(this);mainLayout-addWidget(pathLabel);fsWatcher.addPath(path);connect(&fsWatcher,SIGNAL(directoryChanged(QString),this,SLOT(directoryChanged(QString);/(b)监视文件和目录变化监视文件和目录变化响应函数directoryChanged()使用消息对话框提示用户目录发生了改变,具体实现代码如下:void Watcher:directoryChanged(QString path)QMessageBox:information(NULL,tr(目录发生变化),path);(3)运行结果如图9.7所示。