Qt扫盲-QFile理论总结

QFile理论总结

    • 1. 概述
    • 2. 直接操件文件
    • 3. 用 流 方式 操作 文件
      • 1. 读取文件
      • 2. 写文本文件
      • 3. 二进制流读写
    • 4. 静态函数
    • 5. 不同系统存在的问题

1. 概述

QFile 类是一种用于读取和写入文本和二进制文件资源的 I/O 工具类。QFile 类可以单独使用来读写文件,也可以更方便地 和 QTextStream、QDataStream一起使用,在2,3就是记录一下使用的不同点。

我们可以直接在QFile构造的时候设置待操作的文件名(带路径的文件名哈)中传递,也可以随时使用 setFileName() 进行设置。QFile 要求文件路径分隔符为“/”,屏蔽了不同操作系统使用不同的路径。不支持使用其他分隔符(例如,在Windows下文件分隔符就是“\”)。

//这个路径就是对的
QFile file("C:\Users\zhanghongyuan\Desktop\temp\1.txt");

//下面是不对的,使用双 // 也是不推荐的哈
QFile file("C:/Users/zhanghongyuan/Desktop/temp\1.txt");

我们可以使用 exists() 检查文件是否存在,并使用 remove() 删除文件。(更高级的文件系统相关操作由QFileInfo和QDir提供。

文件使用 open() 打开,使用 close() 关闭,并使用 flush() 刷新,也就是立刻把数据写到文件里,一般都是不管的由操作系统自己决定的。

数据通常使用 QDataStream 或 QTextStream 进行读写(更灵活),但我们也可以调用 QIODevice 继承的函数 read() 、readLine() 、readAll() 、write() 。QFile 还继承了 getChar() 、putChar() 和 ungetChar() ,它们一次处理一个字符。

文件的大小由 size() 返回。还可以使用 pos() 获取当前文件位置,也可以使用 seek() 移动到新的文件位置。如果已到达文件的末尾,atEnd() 返回 true,这个就是判断文件是否读完的标志。

2. 直接操件文件

看下面的例子,我一般就是直接 copy 过去再改改就好。

给 open() 的 QIODevice::Text 标志告诉 Qt 将 Windows 样式的行终止符 (“\r\n”) 转换为 C++ 形式的行终止符 (“\n”)。默认情况下,QFile 假定文件的内容是二进制的,即它不对存储在文件中的字节执行任何转换。像用 流的方式读的话就会把文件的内容转成 QString 类型的 Unicode 。所有我们得出一个结论:读二进制数据的话就用这种直接的方式就好。当然我们读取到的内容 可以把 QByteArray 转成QString类型的哈,前提是文件里确实可以转的字符串格式。

QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
	return;

while (!file.atEnd()) {
	QByteArray line = file.readLine();
	process_line(line);
}

这个是逐行读取,

如果是要一次性读完的话就用:readAll()
如果要读指定的大小的文本就用:read(qint64 maxSize) 通过设置 maxSize来指定读取大小

对于精细化的读取就用 getChar() 、putChar() 和 ungetChar() 这种和C语言的基本一致。

3. 用 流 方式 操作 文件

1. 读取文件

下面是用 来读文件。也是推荐读文本文件的方式

QFile file("in.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
	return;

QTextStream in(&file);
while (!in.atEnd()) {
	QString line = in.readLine();
	process_line(line);
}

QTextStream 会将存储在磁盘上的 8 位数据转换为 16 位 Unicode 格式 QString类型。默认情况下,QTextStream 会假定使用用户系统的本地 8 位编码(例如,在大多数基于 unix 的操作系统上为 UTF-8;有关详细信息,请参阅 QTextCodec::codecForLocale())。这可以使用QTextStream::setCodec() 进行设置。有时候从文件里读取乱码就得用
setCodec()来设置文件的编码格式。常用的格式也就是 setCodec的参数有"ISO 8859-1", “UTF-8”, 和 “UTF-16”。

QTextStream out(&file);
out.setCodec("UTF-8"); //能解决很多问题

2. 写文本文件

要写入文本,我们可以使用运算符 <<() ,它重载在左侧获取 QTextStream,在右侧获取各种数据类型(包括 QString):

QFile file("out.txt");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
	return;

QTextStream out(&file);
out << "The magic number is: " << 49 << "\n";

//关闭文件
file.close();

3. 二进制流读写

QDataStream 与此类似,您可以使用运算符<<() 写入数据,并使用运算符>>() 将其读回。有关详细信息,请参阅类文档。DataStream 是编码信息的二进制流,100%独立于主机的操作系统,CPU或字节顺序。例如,由 Windows 下的 PC 写入的数据流可以由运行 Solaris 的 Sun SPARC 读取。

//写入二进制文件
QFile file("file.dat");
file.open(QIODevice::WriteOnly);
QDataStream out(&file);   // we will serialize the data into the file
out << QString("the answer is");   // serialize a string
out << (qint32)42;        // serialize an integer
  
// 从二进制文件读
QFile file("file.dat");
file.open(QIODevice::ReadOnly);
QDataStream in(&file);    // read the data serialized from the file
QString str;
qint32 a;
in >> str >> a;           // extract "the answer is" and 42

当您使用 QFile、QFileInfo和 QDir 通过 Qt 访问文件系统时,您可以使用 Unicode 文件名。在 Unix 上,这些文件名被转换为 8 位编码。如果要使用标准C++ API(或)或特定于平台的 API 而不是 QFile 来访问文件,则可以使用 encodeName() 和 decodeName() 函数在 Unicode 文件名和 8 位文件名之间进行转换。因为 QByteArray 可以转成 char * 类型的字符串。

  • QByteArray QFile::encodeName(const QString &fileName) -> 把 Unicode 的 QString 转成 8进制的 QByteArray
  • QString QFile::decodeName(const QByteArray &localFileName) -> 把 8进制的 QByteArray 转成 Unicode 的 QString

4. 静态函数

函数名 含义
copy(const QString &fileName, const QString &newName) 复制旧文件到新文件,会创建但不会覆盖,而且失败了会返回值
exists(const QString &fileName) 判断文件是否存在
link(const QString &fileName, const QString &linkName) 就是创建快捷方式是 linkName 指向 fileName,也是创建新文件
permissions(const QString &fileName) 这个平台性的,和 linux 的 9中 rwx 对应
remove(const QString &fileName) 删除文件
rename(const QString &oldName, const QString &newName) 重命名文件
resize(const QString &fileName, qint64 sz) 重置文件大小
setPermissions(const QString &fileName, QFileDevice::Permissions permissions) 设置权限
symLinkTarget(const QString &fileName) 从 快捷方式找到源文件

5. 不同系统存在的问题

在 Unix 系统上,有一些特殊的系统文件(例如在 /proc 中),size() 将始终返回 0,但您仍然可以从这样的文件中读取更多数据;数据是在直接响应您调用 read() 时生成的。但是,在这种情况下,您不能使用 atEnd() 来确定是否有更多数据要读取(因为对于声称大小为 0 的文件,atEnd() 将返回 true)。/proc/modules 逐行:
相反,应该调用 readAll() ,或者重复调用 read() 或 readLine() ,直到无法读取更多数据。下一个示例使用 QTextStream 读取

QFile file("/proc/modules");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
	return;

QTextStream in(&file);
QString line = in.readLine();
while (!line.isNull()) {
	process_line(line);
	line = in.readLine();
}

权限问题:
文件权限在类Unix系统和Windows上的处理方式不同。在类 Unix 系统上的不可写目录中,无法创建文件。在Windows上并非总是如此,例如,“我的文档”目录通常不可写,但仍然可以在其中创建文件。
Qt 对文件权限的理解是有限的,这尤其影响了 QFile::setPermissions() 函数。在Windows上,Qt将仅设置传统的只读标志,并且仅在不传递任何Write*标志时设置。Qt不操作访问控制列表(ACL),这使得此功能对 NTFS卷 几乎没用。它可能仍然适用于使用 VFAT 文件系统的 U 盘。POSIX ACL 也不会有效。

你可能感兴趣的:(#,▶,Qt扫盲,QFile,QFile使用,QFile理论,QFile读取文件,QFile操作文件)