QDir 类
QDir类提供对目录结构及其内容的访问。
Header: | #include < QDir > |
---|---|
qmake: | QT += core |
Inherits: | |
Inherited By: |
详述
QDir用于操作路径名、访问有关路径和文件的信息以及操作底层文件系统。它也可以用来访问Qt的资源系统。
Qt使用“ /”作为通用目录分隔符,就像使用“ /”作为URL中的路径分隔符一样。 如果您始终使用“ /”作为目录分隔符,则Qt将转换您的路径以符合基础操作系统。
QDir可以使用相对路径或绝对路径指向文件。 绝对路径以目录分隔符(在Windows下为驱动器规范开头)开头。 相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。
绝对路径示例:
QDir("/home/user/Documents")
QDir("C:/Documents and Settings")
在Windows上,当用于访问文件时,上面的第二个示例将转换为C:\ Documents and Settings
。
相对路径的示例:
QDir("images/landscape.png")
可以使用isRelative() 或isAbsolute() 函数来检查QDir是使用相对还是绝对文件路径。 调用makeAbsolute() 将相对的QDir转换为绝对的QDir。
导航和目录操作
目录的路径可以通过path() 函数获得,而新路径可以通过setPath() 函数获得。 通过调用absolutePath() ,可以找到目录的绝对路径。
使用dirName() 函数可以找到目录的名称。 这通常会返回绝对路径中的最后一个元素,该元素指定目录的位置。 但是,它也可以返回“。” 如果QDir代表当前目录。
QDir("Documents/Letters/Applications").dirName() // "Applications"
QDir().dirName() // "."
目录的路径也可以使用cd() 和cdUp() 函数进行更改,这两个函数的作用类似于熟悉的Shell命令。 当使用现有目录的名称调用cd() 时,QDir对象将更改目录,使其代替该目录。 cdUp() 函数更改QDir对象的目录,使其引用其父目录。 即cd(“ …”)等同于cdUp() 。
可以使用mkdir() 创建目录,使用rename() 重命名目录,并使用rmdir() 删除目录。
可以使用exist() 测试是否存在具有给定名称的目录,并且可以使用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对象,可以减少entryList() 和entryInfoList() 返回的条目数。 您可以应用名称过滤器来指定带有文件名需要匹配的通配符的模式,用于选择条目属性并可以区分文件和目录的属性过滤器以及排序顺序。
名称过滤器是传递给setNameFilters() 的字符串列表。 属性过滤器由过滤器的按位或组合组成,这些在调用setFilter() 时指定。 使用setSorting() 和SortFlags的按位OR组合指定排序顺序。
可以使用match() 函数测试文件名是否与过滤器匹配。
当调用entryList() 和entryInfoList() 时,还可以指定过滤器和排序顺序标志,以覆盖先前定义的行为。
当前目录和其他特殊路径
提供了一些返回QDir对象的静态函数来访问某些公共目录。 也有相应的函数返回字符串:
QDir | QString | Return Value |
---|---|---|
current() | currentPath() | 应用程序的工作目录 |
home() | homePath() | 用户的主目录 |
root() | rootPath() | 根目录 |
temp() | tempPath() | 系统的临时目录 |
使用setCurrent() 静态函数还可用于设置应用程序的工作目录。
如果要查找包含应用程序可执行文件的目录,请参见QCoreApplication :: applicationDirPath() 。
使用drivers() 静态函数为包含归档系统的每个设备提供了一个根目录列表。 在Unix系统上,它返回一个包含单个根目录“ /”的列表。 在Windows上,取决于用户系统的配置,该列表通常将包含C:/,并可能包含其他驱动器号,例如D:/。
路径操作和字符串
包含“.”的路径 可以使用canonicalPath() 函数将引用当前目录的元素,引用父目录的“ …”元素和符号链接简化为规范形式。
也可以使用cleanPath() 删除多余的“ /”和“ …”元素来简化路径。
有时需要能够以本机表示形式显示用户平台的路径。 静态的toNativeSeparators() 函数返回指定路径的副本,在该副本中,每个目录分隔符都由基础操作系统的适当分隔符替换。
示例
检查目录是否存在:
QDir dir("example");
if (!dir.exists())
qWarning("Cannot find the example directory");
(我们也可以使用静态便利函数QFile :: exists() 。)
遍历目录并读取文件:
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;
}
另请参见QFileInfo,QFile,QFileDialog,QCoreApplication :: applicationDirPath() 和“查找文件”示例。
公共类型
-
enum Filter
flags Filters
此枚举描述QDir可用的筛选选项;例如,entryList()和entryInfoList()。过滤器的值是通过使用位或操作符组合下列列表中的值来指定的:Constant Value Description QDir::Dirs 0x001 列出与筛选器匹配的目录。 QDir::AllDirs 0x400 列出所有目录;也就是说,不要对目录名应用过滤器。 QDir::Files 0x002 文件列表。 QDir::Drives 0x004 列出磁盘驱动器(在Unix下忽略)。 QDir::NoSymLinks 0x008 不要列出符号链接(不支持符号链接的操作系统会忽略它)。 QDir::NoDotAndDotDot NoDot | NoDotDot 不要列出特殊条目“。”和“…”。 QDir::NoDot 0x2000 不要列出特殊条目“。”。 QDir::NoDotDot 0x4000 不要列出特殊条目"…"。 QDir::AllEntries Dirs | Files |Drives 列出目录、文件、驱动器和符号链接(除非指定系统,否则不会列出损坏的符号链接)。 QDir::Readable 0x010 列出应用程序具有读访问权的文件。可读值需要与Dirs或文件结合使用。 QDir::Writable 0x020 列出应用程序具有写访问权的文件。可写值需要与Dirs或文件结合使用。 QDir::Executable 0x040 列出应用程序具有执行访问权限的文件。可执行值需要与Dirs或文件结合。 QDir::Modified 0x080 仅列出已修改的文件(在Unix上忽略)。 QDir::Hidden 0x100 列出隐藏文件(在Unix上,以"."开头的文件)。 QDir::System 0x200 列出系统文件(在Unix上,包括FIFOs, socket和设备文件;在Windows中,包含。lnk文件) QDir::CaseSensitive 0x800 过滤器应该区分大小写。 除非您设置NoSymLinks值,否则使用“筛选”枚举值来筛选文件和目录列表的函数将包括指向文件和目录的符号链接。
默认构造的QDir不会基于文件的权限过滤掉文件,因此entryList() 和entryInfoList() 将返回所有可读,可写,可执行或这三者的任意组合的文件。这使默认值易于编写,同时又很有用。例如,设置“可读”,“可写”和“文件”标志允许列出应用程序对其具有读访问权,写访问权或两者兼有的所有文件。如果该组合中还包含Dirs and Drives标志,则可以列出所有驱动器,目录,应用程序可以读取,写入或执行的所有文件,以及指向此类文件/目录的符号链接。
要检索目录的权限,请使用entryInfoList() 函数获取关联的QFileInfo对象,然后使用QFileInfo :: permissons() 获取每个文件的权限和所有权。
-
enum SortFlag
flags SortFlags
该枚举描述了QDir可用的排序选项,例如 用于entryList() 和entryInfoList() 。 通过对以下列表中的值进行或运算来指定排序值:Constant Value Description QDir::NoSort -1 默认情况下不排序。 QDir::Name 0x00 按名称排序。 QDir::Time 0x01 按时间排序(修改时间)。 QDir::Size 0x02 按文件大小排序。 QDir::Unsorted 0x03 不排序。 QDir::DirsFirst 0x04 首先放置目录,然后放置文件。 QDir::Reversed 0x08 颠倒排序顺序。 QDir::IgnoreCase 0x10 不区分大小写地排序。 QDir::DirsLast 0x20 首先放置文件,然后放置目录。 QDir::LocaleAware 0x40 使用当前的语言环境设置对项目进行适当排序。 QDir::Type 0x80 按文件类型排序(扩展名)。 只能指定Name、Time、Size、Type中的四个之一。
如果同时指定DirsFirst和Reverseed,则目录仍放在第一位,但顺序相反; 文件将以相反的顺序在目录后列出。
公共函数
创建和析构
- QDir(const QString &path, const QString &nameFilter, QDir::SortFlags sort = SortFlags(Name | IgnoreCase), QDir::Filters filters = AllEntries)
- QDir(const QString &path = QString())
- QDir(const QDir &dir)
- QDir & operator=(QDir &&other)
- QDir & operator=(const QDir &dir)
- void swap(QDir &other)
- ~QDir()
名称和路径
- QString dirName() const
- bool rename(const QString &oldName, const QString &newName)
- QString absoluteFilePath(const QString &fileName) const
- QString absolutePath() const
- QString canonicalPath() const
- QString filePath(const QString &fileName) const
- QString path() const
- void setPath(const QString &path)
- QString relativeFilePath(const QString &fileName) const
过滤器
- QDir::Filters filter() const
- void setFilter(QDir::Filters filters)
- QStringList nameFilters() const
- void setNameFilters(const QStringList &nameFilters)
- QFileInfoList entryInfoList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
- QFileInfoList entryInfoList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
- QStringList entryList(const QStringList &nameFilters, QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
- QStringList entryList(QDir::Filters filters = NoFilter, QDir::SortFlags sort = NoSort) const
- QString operator[](int pos) const
属性
- bool isAbsolute() const
- bool makeAbsolute()
- bool isEmpty(QDir::Filters filters = Filters(AllEntries | NoDotAndDotDot)) const
- bool isReadable() const
- bool isRelative() const
- bool isRoot() const
目录操作
- bool cd(const QString &dirName)
- bool cdUp()
- uint count() const
- void refresh() const
- bool exists(const QString &name) const
- bool exists() const
- bool mkdir(const QString &dirName) const
- bool mkpath(const QString &dirPath) const
- bool remove(const QString &fileName)
- bool removeRecursively()
- bool rmdir(const QString &dirName) const
- bool rmpath(const QString &dirPath) const
- QDir::SortFlags sorting() const
- void setSorting(QDir::SortFlags sort)
- bool operator!=(const QDir &dir) const
- bool operator==(const QDir &dir) const
静态公共函数
搜索路径
- void addSearchPath(const QString &prefix, const QString &path)
- void setSearchPaths(const QString &prefix, const QStringList &searchPaths)
- QStringList searchPaths(const QString &prefix)
常用路径
- QString cleanPath(const QString &path)
- QDir current()
- bool setCurrent(const QString &path)
- QString currentPath()
- QDir home()
- QString homePath()
- QDir root()
- QString rootPath()
- QFileInfoList drives()
- QDir temp()
- QString tempPath()
分割符
- QString fromNativeSeparators(const QString &pathName)
- QChar separator()
- QChar listSeparator()
- QString toNativeSeparators(const QString &pathName)
相对或绝对路径
-
bool isAbsolutePath(const QString &path)
-
bool isRelativePath(const QString &path)
-
bool match(const QString &filter, const QString &fileName)
-
bool match(const QStringList &filters, const QString &fileName)
宏
-
void Q_CLEANUP_RESOURCE(name)
卸载具有基本名称name的.qrc文件指定的资源。
通常,Qt资源会在应用程序终止时自动卸载,但是如果资源位于正在卸载的插件中,请调用Q_CLEANUP_RESOURCE()强制删除资源。
注意:此宏不能在名称空间中使用。 请参阅Q_INIT_RESOURCE文档以获取解决方法。
例:Q_CLEANUP_RESOURCE(myapp);
-
void Q_INIT_RESOURCE(name)
使用指定的基本名称初始化.qrc文件指定的资源。 通常,将资源作为应用程序的一部分构建时,资源将在启动时自动加载。 在某些平台上,对于存储在静态库中的资源,必须使用Q_INIT_RESOURCE() 宏。例如,如果应用程序的资源列在名为myapp.qrc的文件中,则可以通过将以下行添加到main() 函数中来确保在启动时初始化资源:
Q_INIT_RESOURCE(myapp);
如果文件名包含的字符不能是有效C ++函数名的一部分(例如“-”),则必须用下划线字符(“ _”)代替。
注意:此宏不能在名称空间中使用。 应该从main() 调用它。 如果这不可能,则可以使用以下解决方法从函数MyNamespace :: myFunction初始化资源myapp:
inline void initMyResource() { Q_INIT_RESOURCE(myapp); } namespace MyNamespace { ... void myFunction() { initMyResource(); } }