QFile
- 用于读取和写入文件的接口
- QIODevice -> QFileDevice -> QFile
- QFile 是一种输入、输出设备,用于读写文本,二进制文本和资源
- QFile 可以单独使用,也可以与 QTextStream,QDataStream 一起使用
创建 QFile
- argc 参数的数量
- argv 参数列表,第一个参数为程序名
QFile f( filename )
f.fineName()
读取文件
- 打开文件
- 创建输入文件流
- 从流中读取数据
QTextStream 可以在 QIODevice,QByteArray 和 QString 上操作。可以方便的读写单词,行和数字。支持格式设置
#include <QFile> #include <QDebug> void readFile() { QFile f("words.txt"); // 打开文件并确认打开成功 if (!f.open(QIODevice::ReadOnly)) { qWarning() << "Cannot open file for reading"; return; } // 创建输入文件流 QTextStream instream(&f); // 从流中读取数据 QString line; while (!instream.atEnd()) { line = instream.readLine(); qDebug() << line; } }
写入文件
- 打开文件,没有的话会自动创建
- 创建输出文件流
- 使用写入操作符写入改流
void writeFile() { QFile f("names.txt"); // 打开文件并确认打开成功 if (!f.open(QIODevice::WriteOnly)) { qWarning() << "Cannot open file for writing"; return; } // 创建输出文件流 QTextStream outstream(&f); // 向流中写入数据 outstream << "张三" << Qt::endl; outstream << "李四" << Qt::endl; outstream << "王五" << Qt::endl; }
拷贝文件
QFile::copy( src, dest )
- 不需要创建 QFile 和打开文件
void copyFile() { QString src = "names.txt"; if (!QFile(src).exists()) { qWarning() << "The source file does not exist"; return; } QString dest = "new_names.txt"; // 不需要创建 QFile 和打开文件 QFile::copy(src, dest); }
QDir
- 对目录结构及其内容的访问
获取目录中的文件信息
QDir dir;
dir.setFilter(); // 设置文件过滤
dir.setSorting(); // 设置文件排序
dir.entryInfoList(); // 返回 QFileInfoList
- QFileInfoList 等同于 QList<QFileInfo>
- QString 的 arg() 方法中,第二个参数为对其长度,正数表示右对齐,负数表示左对齐
void getFiles() { QDir dir; dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); dir.setSorting(QDir::Size | QDir::Reversed); QFileInfoList list = dir.entryInfoList(); qDebug() << " Bytes Filenames"; for (auto& fileinfo : list) { qDebug() << QString("%1 %2").arg(fileinfo.size(), -10).arg(fileinfo.fileName()); } }
目录操作
dir.mkdir( dirname );
dir.exists( dirname );
dir.rename( oldname, newname );
dir.mkpath( path); // 例如 "temp/newdir"
void dirOperation() { QDir dir; if (dir.mkdir("mydir")) { qDebug() << "mydir is successfully created"; } dir.mkdir("mydir2"); if (dir.exists("mydir2")) { dir.rename("mydir2", "newdir"); } dir.mkpath("temp/subdir"); }
特殊目录(静态函数)
QDir | QString |
current() | currentPath() |
home() | homePath() |
root() | rootPath() |
temp() | tempPath() |
QDir::setCurrent( QString path );
QCoreApplication::applicationDirPath(); // 可执行文件目录
QDir::drives(); // 根目录列表
void commonDirs() { qDebug() << QDir::currentPath(); qDebug() << QDir::homePath(); qDebug() << QDir::rootPath(); qDebug() << QDir::tempPath(); qDebug() << QDir::drives(); }
QFileInfo
- 独立与系统的文件信息,包括文件的名称和在文件系统的位置,访问时间,修改时间,权限和文件所有权
获取文件信息
QFileInfo fileInfo( filename );
fileInfo.lastRead();
fileInfo.lastModified();
void readRecord() { QFileInfo fileinfo("text.txt"); QDateTime last_read = fileinfo.lastRead(); QDateTime last_modified = fileinfo.lastModified(); qDebug() << "Last read:" << last_read.toString(); qDebug() << "Last modified:" << last_modified.toString(); }
列出文件内容
dir.filter(); // 当前已经应用的 filters
QDirIterator it(dir); // 注意,要包含头文件 QDirIterator
fileInfo = it.nextFileInfo();
- 使用迭代器会让 dir.setSorting() 失效
void listDirContent() { QDir dir; dir.setFilter(QDir::Files | QDir::AllDirs); dir.setFilter(dir.filter() | QDir::NoDotAndDotDot); dir.setSorting(QDir::Size | QDir::Reversed); // 使用迭代器会让排序失效 qDebug() << QString("Filename").leftJustified(30).append("Bytes"); QDirIterator it(dir); while (it.hasNext()) { QFileInfo fileinfo = it.nextFileInfo(); QString str = fileinfo.fileName().leftJustified(30); qDebug() << str << fileinfo.size(); } }