Qt 文件操作
Posted cpp_learner
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 文件操作相关的知识,希望对你有一定的参考价值。
操作文件对于开发者来说是非常重要的一项知识点,所以必须得学会它。
QFile
QFile类是直接与IO设备打交道,进行文件读写操作的类,使用QFile类可以直接打开或保存文本文件。
打开文件所用到的枚举:QIODevice
枚举 | 描述 |
---|---|
QIODevice::NotOpen | 设备未打开 |
QIODevice::ReadOnly | 只读 |
QIODevice::WriteOnly | 只写 |
QIODevice::ReadWrite | 可读可写 |
QIODevice::Append | 设备以附加模式打开,以便所有数据都写入文件的结尾 |
QIODevice::Truncate | 如果文件存在,则替换 |
QIODevice::Text | 以纯文本方式打开文件。读取时,行结束符被翻译为’\\n’。写入时,行结束符被转换为本地编码,例如Win32的’\\r\\n’。 |
设置文件名
QFile file;
file.setFileName("testFile.txt"); // 设置文件名,文件打开后不能在调用此函数
或者:QFile file(“testFile.txt”);
判断文件是否存在
存在返回true,不存在返回false
// 判断文件是否存在
if (!file.exists()) {
qDebug() << "文件不存在!";
}
打开文件
打开成功返回true,失败返回false
// 以读写与纯文本方式打开文件
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
qDebug() << "文件打开失败!";
return;
}
写入文件
file.write("写入文件!\\n");
设置文件光标读写的位置
file.seek(0); // 设置在开头位置
读取文件的全部内容
QString str = file.readAll();
判断是否已经读取到文件末尾
是返回true,不是返回false
file.atEnd();
读取文件一行
QString fileContent = file.readLine(); // 读取文件一行
获取文件的大小
qint64 fileSize = file.size();
复制文件
file.copy("newName.txt");
重命名文件
file.rename("strName.txt");
设置文件权限
file.setPermissions(QFileDevice::WriteOther); // 文件的所有者可以写该文件。
具体参数参考枚举QFileDevice
删除文件
file.remove();
关闭文件
file.close();
QTextStream
QTextStream类提供了一个方便的接口来读写文件,可以在QIoDevice、QByteArray、QString上进行操作。使用QTextStream的流操作符,可以方便的读写单次、行和数字。
注意:
在使用QTextStream读写文件有中文内容时,为了能正确识别Unicode码,需要设置一下编码,为了方便更多项目,干脆直接在mian函数中设置全局编码问题,如下:
在main函数中添加如下两行代码即可,需要添加头文件:#include < QTextCodec >
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QTextCodec::setCodecForLocale(codec);
定义
QFile file("QTextStream.txt");
if (!file.open(QFileDevice::ReadWrite | QFileDevice::Text)) {
qDebug() << "文件打开失败!";
return;
}
QTextStream stream(&file);
设置编码
可能会失效;在main函数中添加上面两行代码必定成功!
stream.setAutoDetectUnicode(true);
stream.setCodec("UTF-8");
读取1个字节
QString str = stream.read(1); // 读取1个字节
qDebug() << "read(1):" << str;
写入文件
stream.seek(file.size());
stream << "QTextStream!! hello"; // 写入文件
读取一行
str = stream.readLine(); // 读取一行
qDebug() << "readLine:" << str;
读取一个单词,过滤空格
stream >> str;
qDebug() << "读取一个单词:" << str;
QFileInfo
QFileInfo类的接口函数提供文件的各种信息。
设置一个文件名,作为QFileInfo操作的文件
也可以定义时直接指定,也可以传入QFile类的地址。
QFileInfo fileInfo;
fileInfo.setFile("newName.txt");
获取带有文件名的绝对文件路径
fileInfo.absoluteFilePath();
返回绝对路径,不带文件名
fileInfo.absolutePath();
返回去除路径的文件名
fileInfo.fileName();
返回包含路径的文件名
fileInfo.filePath();
返回不包含文件名的路径
fileInfo.path();
返回文件基名,第一个“.”之前的文件名
fileInfo.baseName();
返回文件基名,最后一个“.”之前的文件名
fileInfo.completeBaseName();
返回最后一个“.”之后的后缀
fileInfo.suffix();
返回第一个“.”之后的后缀
fileInfo.completeSuffix();
判断当前对象是否是一个目录或目录的快捷方式
fileInfo.isDir();
判断当前对象是否是一个文件名或文件的快捷方式
fileInfo.isFile();
判断当前文件是否是可执行文件
fileInfo.isExecutable();
返回文件创建时间
fileInfo.created();
返回文件最后一次被修改的时间
fileInfo.lastModified();
返回文件最后一次呗读取的时间
fileInfo.lastRead();
判断文件是否存在
fileInfo.exists(); // 或者fileInfo.exists(QString &fileName);
返回文件大小,以字节为单位
fileInfo.size();
代码:
#include "TestFile.h"
#include <QFile>
#include <QDebug>
#include <QString>
#include <QFileInfo>
#include <QDateTime>
TestFile::TestFile(QWidget *parent)
: QWidget(parent) {
ui.setupUi(this);
testQFile();
testQFileInfo();
testQTextStream();
}
// QFile
void TestFile::testQFile() {
QFile file;
file.setFileName("testFile.txt"); // 设置文件名,文件打开后不能在调用此函数
// 判断文件是否存在
if (!file.exists()) {
qDebug() << "文件不存在!";
//return;
}
if (!file.open(QIODevice::ReadWrite | QIODevice::Text)) {
qDebug() << "文件打开失败!";
return;
} else {
qDebug() << "打开或创建文件成功!";
}
file.write("写入文件!\\n");
file.seek(0);
// 读取文件的全部内容
QString str = file.readAll();
qDebug() << QString(str);
file.seek(0);
// 循环读取文件的全部内容
while (!file.atEnd()) { // 判断是否达到文件末尾
QString fileContent = file.readLine(); // 读取文件一行
qDebug() << fileContent;
}
// 获取文件的大小
qint64 fileSize = file.size();
// 复制文件
file.copy("newName.txt");
// 重命名文件
file.rename("strName.txt");
// 设置文件权限
file.setPermissions(QFileDevice::WriteOther); // 文件的所有者可以读取该文件。
// 获取文件的权限
QFileDevice::Permissions permission = file.permissions();
// 删除文件
file.remove();
file.close();
}
// QFileInfo
void TestFile::testQFileInfo() {
QFileInfo fileInfo;
QString fileNameDir;
bool isFile;
QDateTime dateTime;
// 设置一个文件名,作为QFileInfo操作的文件
fileInfo.setFile("newName.txt");
// 获取带有文件名的绝对文件路径
fileNameDir = fileInfo.absoluteFilePath();
qDebug() << "absoluteFilePath:" << fileNameDir;
// 返回绝对路径,不带文件名
fileNameDir = fileInfo.absolutePath();
qDebug() << "absolutePath:" << fileNameDir;
// 返回去除路径的文件名
fileNameDir = fileInfo.fileName();
qDebug() << "fileName:" << fileNameDir;
// 返回包含路径的文件名
fileNameDir = fileInfo.filePath();
qDebug() << "filePath:" << fileNameDir;
// 返回不包含文件名的路径
fileNameDir = fileInfo.path();
qDebug() << "path:" << fileNameDir;
// 返回文件基名,第一个“.”之前的文件名
fileNameDir = fileInfo.baseName();
qDebug() << "baseName:" << fileNameDir;
// 返回文件基名,最后一个“.”之前的文件名
fileNameDir = fileInfo.completeBaseName();
qDebug() << "completeBaseName:" << fileNameDir;
// 返回最后一个“.”之后的后缀
fileNameDir = fileInfo.suffix();
qDebug() << "suffix:" << fileNameDir;
// 返回第一个“.”之后的后缀
fileNameDir = fileInfo.completeSuffix();
qDebug() << "completeSuffix:" << fileNameDir;
// 判断当前对象是否是一个目录或目录的快捷方式
isFile = fileInfo.isDir();
qDebug() << "isDir:" << isFile;
// 判断当前对象是否是一个文件名或文件的快捷方式
isFile = fileInfo.isFile();
qDebug() << "isFile:" << isFile;
// 判断当前文件是否是可执行文件
isFile = fileInfo.isExecutable();
qDebug() << "isExecutable:" << isFile;
// 返回文件创建时间
dateTime = fileInfo.created();
qDebug() << "created:" << dateTime;
// 返回文件最后一次被修改的时间
dateTime = fileInfo.lastModified();
qDebug() << "lastModified:" << dateTime;
// 返回文件最后一次呗读取的时间
dateTime = fileInfo.lastRead();
qDebug() << "lastRead:" << dateTime;
// 判断文件是否存在
isFile = fileInfo.exists(); // 或者fileInfo.exists(QString &fileName);
qDebug() << "exists:" << isFile;
// 返回文件大小,以字节为单位
qint64 size = fileInfo.size();
qDebug() << "size:" << size;
}
// QTextStream
void TestFile::testQTextStream() {
QFile file("QTextStream.txt");
if (!file.open(QFileDevice::ReadWrite | QFileDevice::Text)) {
qDebug() << "文件打开失败!";
return;
}
QTextStream stream(&file);
// 设置编码
stream.setAutoDetectUnicode(true);
stream.setCodec("UTF-8");
QString str = stream.read(1); // 读取1个字节
qDebug() << "read(1):" << str;
stream.seek(file.size());
stream << "QTextStream!! hello"; // 写入文件
stream.seek(0);
str = stream.readLine(); // 读取一行
qDebug() << "readLine:" << str;
// 读取一行
str = stream.readAll();
// 读取一个单词,过滤空格
stream.seek(0);
stream >> str;
qDebug() << "读取一个单词:" << str;
file.close();
}
总结:
文件的基本操作接口已经列举出来了,剩下的就是将他们拼成项目所需求的了。
以上是关于Qt 文件操作的主要内容,如果未能解决你的问题,请参考以下文章
26.Qt Quick QML-RotationAnimationPathAnimationSmoothedAnimationBehaviorPauseAnimationSequential(代码片段
VSCode自定义代码片段15——git命令操作一个完整流程