QFileInfo可直接通过路径字符串构造以获取文件元数据;无需打开文件或依赖QFile,支持符号链接、相对路径及跨平台,不存在时相关方法返回默认值。

直接用 QFileInfo 构造对象,再调用对应方法即可获取文件信息;不需要打开文件,也不依赖 QFile。 它本质是读取文件系统元数据,只要路径合法、有权限访问,就能拿到大小、时间、类型等信息。自己用字符串切分或 QFile::size() 都不如它稳——尤其遇到符号链接、多后缀、隐藏文件或跨平台路径时。
构造 QFileInfo 时传入路径字符串就行
最常用的方式就是把用户选中的路径(比如 QFileDialog::getOpenFileName() 返回值)直接传给 QFileInfo 构造函数:
- 路径可以是相对路径(如
"./data/config.json"),QFileInfo不会自动转绝对路径,除非你显式调用makeAbsolute() - 路径可以是符号链接(
.lnk或 Unixsymlink),isSymLink()和symLinkTarget()能区分真实目标 - 路径不一定要存在,但像
size()、lastModified()这类方法在exists()为false时会返回默认值(如 0、空QDateTime)
示例:
.tar.gz
-
suffix()只返回最后一个点之后的部分 →"gz" -
completeSuffix()返回最后一个点之后的全部 →"tar.gz" -
baseName()去掉completeSuffix()后剩下的部分 →"archive" -
completeBaseName()去掉suffix()后剩下的部分 →"archive.tar"
也就是说,对 "abc.def.ghi":suffix() → "ghi",completeSuffix() → "def.ghi",baseName() → "abc",completeBaseName() → "abc.def"。
注意:这个逻辑只在 exists() 为 true 时可靠;若文件不存在,Qt 会退化为纯字符串解析,行为可能和预期不一致。
path()、absolutePath()、canonicalPath() 的差异不能混用
这三个方法返回的都是“路径部分”,但语义完全不同:
-
path()是原始路径中去掉文件名的部分,不做任何转换 → 输入"../logs/app.log",返回"../logs" -
absolutePath()把路径转成绝对路径(基于当前工作目录),但不处理..或.→ 输入"../logs/app.log",可能返回"/home/user/../logs" -
canonicalPath()先转绝对路径,再规范化(消除../.、解析符号链接)→ 返回"/home/logs"(假设/home/user是当前目录)
关键点:canonicalPath() 会触发实际文件系统访问(需要文件存在且有权限),而 path() 和 absolutePath() 是纯字符串操作。如果只是拼路径显示,用 path() 最轻量;如果要做真实路径比对(比如判断两个路径是否指向同一位置),必须用 canonicalPath()。
exists() 必须先检查,否则 size() / time() 等返回无意义值
很多人忽略这一步,直接调 info.size(),结果拿到 0 还以为文件是空的。其实 QFileInfo 不会抛异常,它只是静默返回默认值:
-
size()→ 返回 0 -
created()、lastModified()、lastRead()→ 返回空QDateTime(isValid()为false) -
owner()、group()→ 返回空字符串
所以正确写法永远是:
exists()











