c++ - QFileInfo size() 正在返回快捷方式目标大小
问题描述
我正在扫描这样的文件夹大小:
qint64 dirSize = 0;
int fileCount = 0;
for(QDirIterator itDir(someDir, QDir::NoDotAndDotDot|QDir::Files|QDir::Hidden|QDir::System,
QDirIterator::Subdirectories);
itDir.hasNext(); )
{
itDir.next();
dirSize += itDir.fileInfo().size();
++fileCount;
}
这似乎工作正常。
但是,我注意到包含 Windows 快捷方式 ( .lnk
) 的文件夹返回的大小比预期的要大得多。原因是返回的是快捷方式目标的大小,而不是快捷方式文件本身的大小。
但根据QFileInfo 文档:
在 Windows 上,符号链接(快捷方式)是 .lnk 文件。报告的 size() 是符号链接的大小(不是链接的目标)[...]
所以我的问题是:我在这里做错了什么?如何获取快捷方式文件的大小?
解决方案
出于测试目的,我创建了一个 Qt 的 DLL 文件的快捷方式。我将此快捷方式放入一个空文件夹中。我还创建了 Qt 的 sdktool.exe 的快捷方式,并将其放在同一个文件夹中。
我还注意到 size() 返回实际文件的大小而不是快捷方式的大小。我记得我在旧项目中的行为有些相似,我所做的是在读取大小之前打开文件。
for (QDirIterator itr(someDir, QDir::NoDotAndDotDot|QDir::Files|QDir::Hidden|QDir::System,
QDirIterator::Subdirectories); itr.hasNext();) {
itr.next();
// Shows wrong size
qDebug() << itr.fileName() << ", size (unopened): " << itr.fileInfo().size();
QFile file(itr.filePath());
if (file.exists() && file.open(QIODevice::ReadOnly)) {
// Now the size shows correctly
qDebug() << "Size when opened: " << file.size();
file.close();
}
}
输出:
"sdktool.lnk" , size (unopened): 2817024
Size when opened: 1325
"test.lnk" , size (unopened): 4429312
Size when opened: 951
Windows 10 的文件属性窗口显示“test.lnk”的大小为 951 字节,“sdktool.lnk”的大小为 1325 字节。
推荐阅读
- r - solve.default(gamma[[g]]) 中的错误:系统在计算上是奇异的:倒数条件数 = 7.51229e-20
- go - 防止按值调用自定义(别名)类型的接收器方法?
- c++ - c++ 3d数组函数返回
- arrays - 使我的输出成为预定义数组的 8 位输出
- sql - 合并行的值并将其传输到另一个表中的现有列
- c++ - 如何在 Windows 上运行 dbus-daemon?
- javascript - 如何用正则表达式替换所有出现
- rxjs - RxJs combineLatest 订阅永远不会触发
- javascript - 在 onmousedown 时对 onmouseover 做出反应
- flutter - 无法将“XFIle”类型的值分配给“文件”类型的变量错误