一、总览类名作用QFile文件读写操作的核心类QFileInfo获取文件信息大小、后缀、创建时间等QDir目录操作遍历、创建、删除等QTextStream文本流适合读写直接可读的文本QDataStream数据流适合读写二进制数据QTemporaryFile临时文件QSaveFile安全写文件防止写入中断导致数据损坏QStandardPaths获取系统标准路径如何文档、下载、配置目录二、QFile2.1 打开文件QFile file(strFile); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() file.errorString(); }常用打开模式2.2 写入文件QFile file(strFile); if(!file.open(QIODevice::WriteOnly | QIODevice::Text)) { qDebug() file.errorString(); } else { file.write(Hello Qt!\n); file.write(QString(数字%1).arg(123).toUtf8()); file.close(); //显示调用关闭file析构时若未关闭也会自动关闭 }2.3 读取文件1一次性读取QFile file(strFile); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() file.errorString(); } else { QByteArray data file.readAll(); ui-textEdit-setText(data); }2逐行读取QFile file(strFile); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() file.errorString(); } else { while(!file.atEnd()) { QByteArray line file.readLine(); qDebug() QString(line); } file.close(); }三、QTextStream相比较于使用read/writeQTextStream更适合处理文本数据。3.1 写文本QFile file(strFile); if(file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(file); out.setEncoding(QStringConverter::Utf8); out 姓名张三\n; out 年龄 18 \n; out.flush(); //刷新缓冲区确保写入 }3.2 读文本QFile file(strFile); if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(file); while(!in.atEnd()) { QString strLine in.readLine(); qDebug() strLine; } }3.3 编码设置QTextStream out(file); out.setEncoding(QStringConverter::Utf8);四、QDataStream适合保存结构体、对象、网络数据包等。4.1 写二进制QFile file(strFile); if (file.open(QIODevice::WriteOnly)) { QDataStream out(file); out QString(Qt) 6.5 true; }4.2 读二进制QFile file(strFile); if (file.open(QIODevice::ReadOnly)) { QDataStream in(file); QString name; double version; bool stable; in name version stable; qDebug() name version stable; }优点类型安全、跨平台自动处理字节序五、QFileInfoQFileInfo info(strFile); qDebug() 文件名 info.fileName(); qDebug() 后缀 info.suffix(); qDebug() 绝对路径 info.absoluteFilePath(); qDebug() 大小 info.size(); qDebug() 是否存在 info.exists(); qDebug() 是否为文件 info.isFile(); qDebug() 创建时间 info.birthTime().toString();六、QDir6.1 遍历目录QDir dir(strDir); QStringList filters; filters *.cpp *.h; QStringList files dir.entryList(filters, QDir::Files); for (const QString file : files) { qDebug() file; }QStringList entryList(const QStringList nameFilters, Filters filters NoFilter,SortFlags sort NoSort) const;返回目录中所有文件和目录的名称列表根据之前用setNameFilters和setFilter设置的名称和属性过滤器进行排序并根据用setSorting设定的标志进行排序。可以使用nameFilters、过滤器和排序参数覆盖名称过滤器、文件属性过滤器和排序规范。如果目录不可读、不存在或不符合规范则返回空列表。6.2 创建/删除目录bool mkdir(const QString dirName) const; bool mkdir(const QString dirName, QFile::Permissions permissions) const; bool rmdir(const QString dirName) const; bool mkpath(const QString dirPath) const; bool rmpath(const QString dirPath) const;6.3 获取当前工作目录qDebug() QDir::currentPath();七、QStandardPaths#include QStandardPaths QString docPath QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); QString configPath QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation);注意writableLocation返回的目录不一定存在八、QTemporaryFileQTemporaryFile tempFile; if (tempFile.open()) { tempFile.write(临时数据); qDebug() tempFile.fileName(); } // 文件自动删除注意自动删除依赖对象析构如果未触发析构残留文件依赖系统对临时文件的自动清理机制九、QSaveFileQSaveFile file(config.json); if (file.open(QIODevice::WriteOnly)) { file.write({\theme\:\dark\}); file.commit(); // 真正写入 }大致原理为什么安全使用QSaveFile打开文件时它不会直接打开对应文件而是在同目录下创建一个临时文件所有的writer操作都发生在该临时文件上。commit调用时将该临时文件rename到目标文件完成替换。注意目前不支持QIODevice:ReadWrite、QIODevices:Append、QIODdevice:NewOnly和QIODeviceExistingOnly