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自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode自定义代码片段15——git命令操作一个完整流程

VSCode 如何操作用户自定义代码片段(快捷键)

qt creator源码全方面分析(2-0)