Qt的QDir类使用与文件操作实战
QDir类
QDir是Qt框架中用于处理目录和文件路径的类,它提供了访问目录结构和文件属性的方法,支持跨平台的文件系统操作。
基本用法
创建QDir对象
// 使用当前目录
QDir dir;
// 指定目录路径
QDir dir1("/path/to/directory");
// 使用相对路径
QDir dir2("subdirectory");
检查目录是否存在
if (dir.exists()) {
qDebug() << "目录存在";
} else {
qDebug() << "目录不存在";
}
常用文件操作
获取目录内容
// 获取所有条目(包括文件和目录)
QFileInfoList list = dir.entryInfoList();
// 只获取文件
QStringList files = dir.entryList(QDir::Files);
// 获取特定类型的文件(例如.txt文件)
QStringList txtFiles = dir.entryList(QStringList() << "*.txt", QDir::Files);
遍历目录
QDirIterator it(dirPath, QDirIterator::Subdirectories);
while (it.hasNext()) {
qDebug() << it.next();
}
创建和删除目录
// 创建目录
if (!dir.exists()) {
if (dir.mkpath(".")) {
qDebug() << "目录创建成功";
}
}
// 删除目录(必须为空)
if (dir.rmdir(".")) {
qDebug() << "目录删除成功";
}
// 递归删除目录及其内容
QDir(dirPath).removeRecursively();
文件操作
// 重命名文件
QFile::rename("oldname.txt", "newname.txt");
// 删除文件
if (QFile::remove("file.txt")) {
qDebug() << "文件删除成功";
}
// 复制文件
QFile::copy("source.txt", "destination.txt");
路径操作
获取和设置路径
// 获取当前路径
QString currentPath = dir.currentPath();
// 设置当前工作目录
dir.setCurrent("/new/path");
// 获取路径
QString absPath = dir.absolutePath();
// 获取规范路径(去除冗余部分)
QString canonicalPath = dir.canonicalPath();
路径拼接
QString fullPath = QDir::cleanPath(dir.path() + QDir::separator() + "subdir");
文件信息获取
QFileInfo fileInfo("example.txt");
qDebug() << "文件名:" << fileInfo.fileName();
qDebug() << "文件大小:" << fileInfo.size() << "字节";
qDebug() << "最后修改时间:" << fileInfo.lastModified().toString();
qDebug() << "是否可读:" << fileInfo.isReadable();
qDebug() << "是否可写:" << fileInfo.isWritable();
实战示例
示例1:统计目录下文件数量和大小
void countFilesAndSize(const QString &dirPath) {
QDir dir(dirPath);
if (!dir.exists()) {
qWarning() << "目录不存在:" << dirPath;
return;
}
int fileCount = 0;
qint64 totalSize = 0;
QDirIterator it(dirPath, QDir::Files, QDirIterator::Subdirectories);
while (it.hasNext()) {
it.next();
fileCount++;
totalSize += it.fileInfo().size();
}
qDebug() << "文件数量:" << fileCount;
qDebug() << "总大小:" << totalSize << "字节 ("
<< totalSize / 1024 << "KB)";
}
示例2:批量重命名文件
bool batchRenameFiles(const QString &dirPath, const QString &prefix) {
QDir dir(dirPath);
if (!dir.exists()) {
qWarning() << "目录不存在:" << dirPath;
return false;
}
QStringList filters;
filters << "*.jpg" << "*.png"; // 只处理jpg和png文件
QStringList files = dir.entryList(filters, QDir::Files);
int counter = 1;
foreach (QString file, files) {
QString newName = QString("%1%2.%3")
.arg(prefix)
.arg(counter++, 3, 10, QChar('0'))
.arg(QFileInfo(file).suffix());
if (!dir.rename(file, newName)) {
qWarning() << "重命名失败:" << file << "->" << newName;
return false;
}
}
return true;
}
示例3:查找特定文件
QString findFile(const QString &startDir, const QString &fileName) {
QDirIterator it(startDir, QDirIterator::Subdirectories);
while (it.hasNext()) {
it.next();
if (it.fileName() == fileName) {
return it.filePath();
}
}
return QString(); // 未找到返回空字符串
}
注意事项
- 跨平台兼容性:使用QDir::separator()代替硬编码的路径分隔符
- 权限问题:操作前检查文件/目录的读写权限
- 路径处理:使用QDir::cleanPath()规范化路径
- 错误处理:检查每个操作的返回值
- 性能考虑:对于大型目录,考虑使用QDirIterator而非entryInfoList()
通过合理使用QDir类,可以轻松实现跨平台的目录和文件操作功能。
(本文地址:https://www.nzw6.com/6718.html)