介绍
QFile是Qt中提供的文件I/O操作类,它支持在Windows、MacOS和Linux等操作系统下操作文件。使用QFile可以方便地读取、写入和处理文件,同时还能检查文件的大小、相关属性和状态等。
QFile是一个非常重要的类,它提供了I/O操作文件的基本功能,可以轻松读写数据,并提供许多与文件相关的工具函数 ,同时还支持跟踪文件系统中文件内容的变化。因此,在Qt编程过程中,QFile是不可或缺的一个类
作用
具体来说,QFile类可以完成以下功能:
-
文件的打开和关闭:使用QFile,可以通过open()函数以指定模式打开文件,并使用close()函数关闭文件。
-
读取和写入文件数据:使用QFile进行文件读写操作时,可以首先使用seek()函数移动文件指针的位置,然后使用read()或write()函数读取或写入文件中的数据。此外,为了更加方便灵活地读取和写入文件的内容,也可以使用QTextStream类。
-
处理文件中的位置和大小:QFile提供许多用于管理文件指针位置和文件大小的函数,如pos(),size()和atEnd()函数。通过这些函数可以得到文件指针的当前位置、文件的总大小以及判断文件是否被读取完。
-
查询文件及其相关属性:除了读写文件,还可以使用QFile查询文件及其相关属性,比如exists()、isReadable()、isWritable()等函数,分别用于检查文件是否存在、文件是否可读、文件是否可写等信息。
-
监听文件内容变化:通过调用QFileSystemWatcher监视文件,并连接相应的信号和槽,可以实现监听文件内容的变化,并在发生变化时采取相应的行动。
接口
QFile是Qt中用于对文件进行基本I/O操作的类。其接口函数提供了丰富的功能,包括:
-
open():以指定的模式打开文件,支持多种打开模式。如QIODevice::ReadOnly表示只读模式,QIODevice::WriteOnly表示只写模式,QIODevice::Append表示追加模式等等。返回值为布尔类型,表示是否打开成功。
-
close():关闭当前已打开的文件。
-
read()和write():分别用于从文件中读取数据和向文件中写入数据。read()函数具有多个重载版本,可以通过指定参数来实现按字节数读取、按行读取、读取全部内容等不同功能。
-
seek():用于跳转文件读写指针位置。常见的用法是将指针移动到文件开头或结尾,以获取文件大小或检查文件结束标志,也可以指定要跳转到的具体位置。
-
atEnd():查询当前文件指针是否已到达文件末尾。
-
pos()和size():pos()函数返回当前文件指针所在的位置,size()函数返回文件的总大小。
-
flush():刷新文件缓存,确保写入的内容已经被写入到文件中。
-
error():返回文件操作过程中发生的错误代码。如果没有出错则返回QFile::NoError。
-
fileName():返回当前文件的文件名。
-
exists()、isReadable()、isWritable()、isExecutable():查询当前文件是否存在、是否可读、是否可写、是否可执行等信息。这些函数的返回值均为布尔类型。
QFile还有一些其他的接口函数,比如isSequential()(判断当前文件是否是顺序访问),setPermissions()(设置文件权限)等等。总体来说,QFile提供了一整套丰富的接口函数,方便用户进行文件的读写以及管理。
使用示例
以下代码演示了文件的打开、写入、读取、关闭,以及文件信息输出等基本用法。
#include <QCoreApplication>
#include <QFile>
#include <QDebug>
#include <QDateTime>
#include <QTextStream>
#include <QFileInfo>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString file_path = "test.txt";
QFile my_file(file_path); // 实例化QFile对象
if(!my_file.open(QIODevice::ReadWrite | QIODevice::Text |QIODevice::Append))
{
qDebug() << "Open file failed.";
return -1;
}
else
{
qDebug() << "Open file success.";
}
#if 0
// 写入文件
QString content = "Hello World!";
if(my_file.write(content.toStdString().c_str()) == -1)
{
qDebug() << "Write file failed.";
}
#endif
// 写入文件
QString content2 = "Hello Qt!";
QTextStream out(&my_file);
out << content2;
my_file.flush();
// 跳转到文件开头
my_file.seek(0);
// 读取文件内容
QByteArray data = my_file.readAll();
qDebug() << "Read from file:" << data;
// 跳转到文件开头
my_file.seek(0);
// 读取文件内容
QTextStream in(&my_file);
QString strData = in.readAll();
qDebug() << "Read All:" << strData;
// 跳转到文件开头
my_file.seek(0);
// 读取文件内容
while (!my_file.atEnd()) {
QByteArray line = my_file.readLine();
qDebug() << "readLine:" << line;
}
// 获取当前文件指针位置
qint64 pos = my_file.pos();
qDebug() << "Current position is:" << pos;
// 获取文件大小
qint64 size = my_file.size();
qDebug() << "File size is:" << size;
QFileInfo file_info(my_file);
qDebug() << "File name: " << file_info.fileName();
qDebug() << "Path: " << file_info.path();
qDebug() << "Owner: " << file_info.owner();
qDebug() << "Creation time: " << file_info.created();
qDebug() << "Last modified time: " << file_info.lastModified();
qDebug() << "Is readable: " << file_info.isReadable();
qDebug() << "Is writable: " << file_info.isWritable();
qDebug() << "Is executable: " << file_info.isExecutable();
my_file.close();
return a.exec();
}
代码输出内容:
11:27:36: Starting /home/guo/build-File-Desktop_Qt_5_15_2_GCC_64bit-Debug/File...
Open file success.
Read from file: "Hello World!"
Read All: "Hello World!"
readLine: "Hello World!"
Current position is: 12
File size is: 12
File name: "test.txt"
Path: "."
Owner: "guo"
Creation time: QDateTime(2023-06-04 11:27:36.967 CST Qt::LocalTime)
Last modified time: QDateTime(2023-06-04 11:27:36.967 CST Qt::LocalTime)
Is readable: true
Is writable: true
Is executable: false