QDir类用于访问目录及其内容。QDir用于处理路径名,获取路径及文件的相关信息,以及操作底层文件管理系统。他也可用于访问Qt资源系统。
类似URLs,Qt将'/'作通用目录分隔符。Qt会将以'/'作为目录分隔符的路径翻译给底层文件系统。
QDir用相对路径或绝对路径表示文件位置。绝对路径以'/'开始(windows下,路径前是否加驱动器可选)。相对路径以目录名或文件名开始,是一个相对于当前目录的路径。
绝对路径例子:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
windows下,上面的第2个例子,访问文件时,会被翻译成 C:\Documents and Settings。
相对路径例子:
QDir("images/landscape.png")
isRelative()和isAbsolute()用于查询QDir使用的是相对路径,还是绝对路径。makeAbsolute()将相对路径转换为绝对路径。
导航和目录操作
path()用于获取目录路径,setPath()用于设置新路径。absolutePath()用于获取目录的绝对路径。
dirName()返回目录名称,返回值为绝对路径的最后一个元素,表示目录的位置。若QDir表示当前目录,dirName()返回"."。
QDir("Documents/Letters/Applications").dirName() // "Applications"
QDir().dirName() // "."
cd()、cdUp()能修改目录所在路径,他们运行方式与命令行(shell commands)类似。调用cd(),传入一个存在的目录,QDir对象用修改目录,用新目录代替原有目录。调用cdUp(),QDir对象指向原有目
录的父目录。cdUp()等同于cd("..")。
mkdir()用于创建目录,rename()用于修改目录名称,rmdir()用于删除目录。
exists()用于查询目录是否存在。isReadable()、isAbsolute()、isRelative()和isRoot()用于查询目录属性。
refresh()用于从磁盘中重新读取目录数据。
文件和目录相关内容:
目录下包含的条目有,文件、目录、符号链接。count()用于返回目录下的条目数量。entryList()用于返回目录下所有条目的名称列表。entryInfoList用于获取所有条目的详细信息,每个条目的详细信息
用QFileInfo表示。
filePath()和absoluteFilePath()用于创建目录下文件和目录的路径。
filePath()用于返回指定文件或目录的相对路径(以QDir对象为参照)。absoluteFilePath()用于返回指定文件或目录的绝对路径。这两条函数都不检查文件或目录是否存在。他们仅构造路径。
QDir directory("Documents/Letters");
QString path = directory.filePath("contents.txt");
QString absolutePath = directory.absoluteFilePath("contents.txt");
remove()用于删除文件。目录不能像文件那样被删除,用rmdir()来删除他们。
在QDir对象上应用过滤器filter,可能会降低entryList()和entryInfoList()返回的条目数量。你可以给QDir对象设置一个名称过滤器(需设定一个通配符,表明文件名称需要匹配的条件)、一个属性过滤
器(需选定条目若干属性,能区别出文件和目录)和一个排序。
名称过滤器是一些字符串列表,由setnameFilters()传入。多属性过滤器可由多个单属性过滤器的位或组合而成,由setFilter()传入设定。setSorting()用于设置排序顺序,设置内容为多个排序标识的位
或组合。用match()测试文件名是否匹配过滤器。
调用entryList() and entryInfoList(),可能也需要设置过滤器和排序标识,从而重写了以前操作。
当前路径和其他指定路径
一组返回值为QDir的静态函数为普通目录提供访问服务
。此外,还有一组对应的返回值为字符串的函数:
QDir QString 返回值
current() currentPath() 应用工作目录
home() homePath() 用户家目录
root() rootPath() 根目录
temp() tempPath() 系统临时目录
静态函数setCurrent()用于设置应用工作目录。
若想获得应用执行文件所在目录,详见QCoreApplication::applicationDirPath()。
静态函数drives()返回每一个装有文件管理系统设备的根目录列表。Unix系统下,返回的列表内仅有一个根目录"/"。windows下,通常包含C:/,也有可能有其他盘符D:/,结果取决于用户系统的设定。
路径操作和字符串
"."代表当前目录,包含"."的路径都是当前目录的相对路径, ".."代表父目录, 用canonicalPath()设置canonical格式,可减少符号链接数量。
用cleanPath()可简化路径,删除其内多余的"/"和".."。
当需要显示用户平台的本地风格路径时,静态函数toNativeSeparators(),将指定的路径中的分隔符替换为与底层操作系统一致的分隔符后,后返回该路径拷贝值。
例子:
检查路径是否存在:
QDir dir("example");
if (!dir.exists())
qWarning("Cannot find the example directory");
(也能用更方便的QFile::exist())
遍历目录并读文件:
QDir dir = QDir::root(); // "/"
if (!dir.cd("tmp")) { // "/tmp"
qWarning("Cannot find the \"/tmp\" directory");
} else {
QFile file(dir.filePath("ex1.txt")); // "/tmp/ex1.txt"
if (!file.open(QIODevice::ReadWrite))
qWarning("Cannot create the file %s", file.name());
}
以下程序列出当前目录下所有文件(除了符号链接),按大小排序,小的在前:
#include <QDir>
#include <iostream>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QDir dir;
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setSorting(QDir::Size | QDir::Reversed);
QFileInfoList list = dir.entryInfoList();
std::cout << " Bytes Filename" << std::endl;
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)
.arg(fileInfo.fileName()));
std::cout << std::endl;
}
return 0;
}