一、描述
QFileInfo 提供有关文件系统中文件的名称和位置(路径)、访问权限、文件类型等信息。
FileInfo 还可用于获取有关 Qt 资源的信息。这个类是隐式共享的。
二、成员函数
2.1、判断函数
1、bool isAbsolute()
文件路径是否绝对路径。
注意:以冒号 (:) 开头的路径始终被视为绝对路径,因为它们表示 QResource。
2、bool isBundle()
对象是否指向一个包或指向 macOS 和 iOS 上的包的符号链接。
3、bool isDir()
对象是否指向目录或指向目录的符号链接。
4、bool isExecutable()
文件是否是可执行的。
如果文件是符号链接,并且目标是可执行的,则此函数返回 true。
5、bool isFile()
对象是否指向文件或指向文件的符号链接。
如果文件是符号链接,并且目标是常规文件,则此函数返回 true。
6、bool isHidden()
是否隐藏文件。
7、bool isJunction()
对象是否指向一个连接点。
连接仅存在于 Windows 的 NTFS 文件系统上,并且通常由 mklink 命令创建。 它们可以被认为是目录的符号链接,并且只能为本地卷上的绝对路径创建。
8、bool isNativePath()
如果文件路径可以直接用于本机 API,则返回 true。 如果 Qt 内的虚拟文件系统(例如 Qt 资源系统)支持该文件,则返回 false。
本机路径可能仍需要转换路径分隔符和字符编码,具体取决于本机 API 的平台和输入要求。
9、bool isReadable()
用户是否可以读取文件。
如果文件是符号链接,并且目标可读,则此函数返回 true。
注意:如果未启用 NTFS 权限检查,Windows 上的结果将仅反映文件是否存在。
10、bool isRelative()
文件路径是否相对的。
注意:以冒号 (:) 开头的路径始终被视为绝对路径,因为它们表示 QResource。
11、bool isRoot()
对象是否指向根目录或指向根目录的符号链接。
12、bool isShortcut()
对象是否指向快捷方式。
快捷方式仅存在于 Windows 上,通常是 .lnk 文件。
快捷方式 (.lnk) 文件被视为常规文件。 打开这些将打开 .lnk 文件本身。 为了打开快捷方式引用的文件,必须在快捷方式上使用 symLinkTarget()。
注意:即使快捷方式(损坏的快捷方式)指向不存在的文件,isShortcut() 也会返回 true。
13、bool isSymLink()
对象是否指向符号链接或快捷方式。
14、bool isSymbolicLink()
对象是否指向符号链接。
15、bool isWritable()
用户是否可以写入文件。
如果文件是符号链接,并且目标是可写的,则此函数返回 true。
注意:如果未启用 NTFS 权限检查,Windows 上的结果将仅反映文件是否标记为只读。
2.2、其他函数
1、QFileInfo(const QDir &dir, const QString &file)
构造一个 QFileInfo,它提供有关给定file相对于目录 dir 的信息。
- 如果 dir 是相对路径,则 QFileInfo 也将具有相对路径。
- 如果 file 是绝对路径,则 dir 指定的目录将被忽略。
QFileInfo(const QString &file)
构造一个 QFileInfo,提供有关给定文件的信息。该文件可以是绝对或相对路径。
2、QDir absoluteDir()
以 QDir 对象的形式返回文件的绝对路径。
3、QString absoluteFilePath()
std::filesystem::path filesystemAbsoluteFilePath()
返回包含文件名的绝对路径。绝对路径名由完整路径和文件名组成。
- 在 Unix 上,这将始终以根目录“/”开头。
- 在 Windows 上,这将始终以“D:/”开头,其中 D 是驱动器号,但未映射到驱动器号的网络共享除外(在这种情况下,路径将以“//sharename/”开头)。驱动器号将大写。
警告:如果 filePath() 为空,则此函数的行为未定义。
4、QString absolutePath()
std::filesystem::path filesystemAbsolutePath()
返回文件的路径绝对路径。 这不包括文件名。
- 在 Unix 上,绝对路径将始终以根目录“/”开头。
- 在 Windows 上,这将始终以“D:/”开头,其中 D 是驱动器号,但未映射到驱动器号的网络共享除外(在这种情况下,路径将以“//sharename/”开头)。
警告:如果 filePath() 为空,则此函数的行为未定义。
5、QString baseName()
返回不带路径的文件的基本名称。
6、QDateTime birthTime()
返回文件创建的日期和时间。如果文件是符号链接,则返回目标文件的时间。
7、QString bundleName()
返回包的名称。
- 在 macOS 和 iOS 上,如果路径 isBundle(),这将返回包的正确本地化名称。
- 在其他平台上,返回一个空的 QString。
QFileInfo fi("/Applications/Safari.app");
QString bundle = fi.bundleName(); // name = "Safari"
8、bool caching()
是否启用了缓存。
9、QString canonicalFilePath()
std::filesystem::path filesystemCanonicalFilePath()
返回包含文件名的规范路径。
10、QString canonicalPath()
std::filesystem::path filesystemCanonicalPath()
返回文件的路径规范路径(不包括文件名)。
11、QString completeBaseName()
返回不带路径的文件的完整基本名称。
QFileInfo info("C:/Users/70957/Pictures/aaa.bbb.jpg");
qDebug()<<info.baseName();
qDebug()<<info.completeBaseName();
12、QString completeSuffix()
返回文件的完整后缀(扩展名)。完整的后缀由文件中第一个 '.' 之后的所有字符组成。
QFileInfo fi("/tmp/archive.tar.gz");
QString ext = fi.completeSuffix(); // ext = "tar.gz"
13、QDir dir()
以 QDir 对象的形式返回对象的父目录的路径。
注意:返回的 QDir 总是对应于对象的父目录,即使 QFileInfo 代表一个目录。
对于以下每个 QFileInfo,dir() 返回 QDir“~/examples/191697”。
QFileInfo fileInfo1("~/examples/191697/.");
QFileInfo fileInfo2("~/examples/191697/..");
QFileInfo fileInfo3("~/examples/191697/main.cpp");
对于以下每个 QFileInfo,dir() 返回 QDir“.”。
QFileInfo fileInfo4(".");
QFileInfo fileInfo5("..");
QFileInfo fileInfo6("main.cpp");
14、bool exists()
文件是否存在。
注意:如果文件是指向不存在文件的符号链接,则返回 false。
[static] bool exists(const QString &file)
使用此静态函数比使用非静态的重载函数进行文件系统访问更快。
15、QString fileName()
返回文件的名称,不包括路径。
QFileInfo info("C:/Users/70957/Pictures/aaa.bbb.jpg");
qDebug()<<info.baseName();
qDebug()<<info.completeBaseName();
qDebug()<<info.fileName();
16、QString filePath()
std::filesystem::path filesystemFilePath()
返回文件名,包括路径。
17、QDateTime fileTime(QFile::FileTime time)
返回时间指定的文件时间。如果文件是符号链接,则返回目标文件的时间。
enum QFileDevice::FileTime:
- FileAccessTime:最近一次访问文件的时间(例如读取或写入)。
- FileBirthTime:创建文件时(在 UNIX 上可能不支持)。
- FileMetadataChangeTime:上次更改文件元数据的时间。
- FileModificationTime:最近一次修改文件的时间。
18、QString group()
返回文件的组。如果文件是符号链接,则此函数返回目标的拥有组。
在 Windows 、文件没有组的系统上返回空字符串。在 Unix 下可能很耗时(毫秒为单位)。
19、uint groupId()
返回文件所属组的 id。如果文件是符号链接,则此函数返回拥有目标的组的 ID(。
在 Windows 、文件没有组的系统上,此函数始终返回 (uint) -2。
20、QString junctionTarget()
std::filesystem::path filesystemJunctionTarget()
将 NTFS 结点解析为它引用的路径。不能保证由 NTFS 联结命名的目录确实存在。
返回 NTFS 连接点指向的目录的绝对路径,如果对象不是 NTFS 连接点,则返回空字符串。
21、QDateTime lastModified()
返回上次修改文件的日期和本地时间。如果文件是符号链接,则返回目标文件的时间。
22、QDateTime lastRead()
返回上次读取文件的日期和本地时间。如果文件是符号链接,则返回目标文件的时间。
在此信息不可用的平台上,返回与 lastModified() 相同的内容。
23、bool makeAbsolute()
如果文件的路径不是绝对路径,则将文件的路径转换为绝对路径。
返回 true 表示路径已转换; 否则返回 false 表示路径已经是绝对路径。
24、QDateTime metadataChangeTime()
返回文件元数据更改的日期和时间。如果文件是符号链接,则返回目标文件的时间。
25、QString owner()
返回文件的所有者。在文件没有所有者的系统上,或者如果发生错误,则返回空字符串。
如果文件是符号链接,则此函数返回目标的所有者。
这个函数在 Unix 下可能很耗时(毫秒为单位)。
在 Windows 上,除非启用了 NTFS 权限检查,否则它将返回一个空字符串。
26、uint ownerId()
返回文件所有者的 ID。如果文件是符号链接,则此函数返回目标所有者的 ID。
在 Windows 和文件没有所有者的系统上,此函数返回 ((uint) -2)。
27、QString path()
std::filesystem::path filesystemPath()
返回文件的路径。不包括文件名。
28、bool permission(QFile::Permissions permissions)
测试文件权限。权限参数可以是多个 QFile::Permissions 类型的标志或一起检查权限组合。
在文件没有权限的系统上,此函数始终返回 true。
注意:如果未启用 NTFS 权限检查,结果在 Windows 上可能不准确。
如果文件是符号链接,则此函数会检查目标的权限。
enum QFileDevice::Permission:文件的权限和所有权。可以将这些值进行 OR 运算以测试多个权限和所有权值。
- ReadOwner:文件可供所有者读取。
- WriteOwner:文件可供所有者写入。
- ExeOwner:文件可供所有者执行。
- ReadUser:文件可供用户读取。
- WriteUser:文件可供用户写入。
- ExeUser:文件可供用户执行。
- ReadGroup:文件可供组读取。
- WriteGroup:文件可供组写入。
- ExeGroup:文件可供组执行。
- ReadOther:文件可供任何人读取。
- WriteOther:文件可供任何人写入。
- ExeOther:文件可供任何人执行。
29、QFile::Permissions permissions()
返回文件的 QFile::Permissions 的完整 OR 组合。
如果文件是符号链接,则此函数返回目标(而不是符号链接)的权限。
30、void refresh()
刷新有关文件的信息,即在下次获取缓存属性时从文件系统中读取信息。
31、void setCaching(bool enable)
设置是否启用文件信息的缓存。默认情况下启用缓存。
启用缓存后,将会首次在需要时从文件系统读取文件信息,之后从缓存中读取文件信息。
32、void setFile(const QString &file)
void setFile(const std::filesystem::path &file)
设置 QFileInfo 提供有关文件的信息的文件。
文件可以包括绝对或相对路径。绝对路径以目录分隔符(例如 Unix 下的“/”)或驱动器规范(Windows 下)开头。 相对文件名以目录名或文件名开头,并指定相对于当前目录的路径。
QString absolute = "/local/bin";
QString relative = "local/bin";
QFileInfo absFile(absolute);
QFileInfo relFile(relative);
QDir::setCurrent(QDir::rootPath());
// absFile 和 relFile 现在指向同一个文件
QDir::setCurrent("/tmp");
// absFile 现在指向“/local/bin”,
// 而 relFile 指向“/tmp/local/bin”
void setFile(const QDir &dir, const QString &file)
设置 QFileInfo 为目录 dir 中的 file 提供信息的文件。
如果 file 包含相对路径,则 QFileInfo 也将具有相对路径。
33、qint64 size()
以字节为单位返回文件大小。如果文件不存在或无法获取,则返回 0。
如果文件是符号链接,则返回目标文件的大小。
34、void stat()
从文件系统中读取所有属性并缓存。
当有关文件系统的信息在工作线程中收集,然后以缓存 QFileInfo 实例的形式传递给 UI 时,这很有用。
35、QString suffix()
返回文件的后缀(扩展名)。后缀由文件中最后一个“.”之后的所有字符组成。
36、QString symLinkTarget()
std::filesystem::path filesystemSymLinkTarget()
返回符号链接指向的文件或目录的绝对路径,如果对象不是符号链接,则返回空字符串。
37、bool operator==(const QFileInfo &fileinfo)
此 QFileInfo 对象是否引用与 fileinfo 位于同一位置的文件。
请注意,比较两个不包含文件引用(不存在或为空的文件路径)的空 QFileInfo 对象的结果是未定义的。
三、宏成员
1、QT_IMPLICIT_QFILEINFO_CONSTRUCTION
定义这个宏会使大多数 QFileInfo 构造函数隐式而不是显式。由于 QFileInfo 对象的构建成本很高,因此应避免意外创建它们。例如:
QDir dir("D:/迅雷下载");
QDirIterator it(dir);
while (it.hasNext())
{
QFileInfo fi = it.next();
qDebug()<<fi.fileName();
}
默认情况下,会报错:试图将QString转成QFileInfo:
在 pro 文件中加入:
DEFINES += QT_IMPLICIT_QFILEINFO_CONSTRUCTION
则可编译通过。
要避免隐式构造 QFileInfo 对象的代价,应该不要使用这个宏。
同时,这里正确获取 QFileInfo 对象的方法: