赞
踩
操作文件对于开发者来说是非常重要的一项知识点,所以必须得学会它。
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类提供了一个方便的接口来读写文件,可以在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操作的文件
也可以定义时直接指定,也可以传入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(); }
总结:
文件的基本操作接口已经列举出来了,剩下的就是将他们拼成项目所需求的了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。