首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QFileInfo size()返回快捷目标大小

QFileInfo size()返回快捷目标大小
EN

Stack Overflow用户
提问于 2018-11-21 12:19:20
回答 2查看 1.1K关注 0票数 2

我正在像这样扫描文件夹大小:

代码语言:javascript
复制
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文件。报告的大小()是符号链接的大小(不是链接的目标).

所以我的问题是:我在这里做错了什么?如何获得快捷方式文件的大小?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-01 02:50:20

@Rob的答案在大多数情况下有效,但当快捷方式的目标不存在/无效时,返回0。

从该方法中得到提示,您还可以复制快捷方式并更改扩展。

因此,将其组合成一个函数(我在这里假设打开目标比复制快捷方式更便宜/更安全):

代码语言:javascript
复制
qint64 getFileSize(const QString &path)
{
    qint64 size = 0;
    QFileInfo fileInfo(path);

    if(fileInfo.isSymLink() && fileInfo.size() == QFileInfo(fileInfo.symLinkTarget()).size())
    {
        // Try this approach first
        QFile file(path);
        if(file.exists() && file.open(QIODevice::ReadOnly))
            size = file.size();
        file.close();

        // If that didn't work, try this
        if(size == 0)
        {
            QString tmpPath = path+".tmp";
            for(int i=2; QFileInfo().exists(tmpPath); ++i) // Make sure filename is unique
                tmpPath = path+".tmp"+QString::number(i);

            if(QFile::copy(path, tmpPath))
            {
                size = QFileInfo(tmpPath).size();
                QFile::remove(tmpPath);
            }
        }
    }
    else size = fileInfo.size();

    return size;
}
票数 1
EN

Stack Overflow用户

发布于 2018-11-21 13:30:48

出于测试目的,我创建了Qt的一个DLL文件的快捷方式。我把这个快捷方式放进了一个空文件夹。我还创建了Qt的sdktool.exe的快捷方式,并将其放在同一个文件夹中。

我还注意到size()返回实际文件的大小,而不是快捷方式的大小。我记得我在以前的项目中有类似的行为,我所做的就是在读取文件大小之前打开文件。

代码语言:javascript
复制
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();
    }
}

产出:

代码语言:javascript
复制
"sdktool.lnk" , size (unopened):  2817024
Size when opened:  1325
"test.lnk" , size (unopened):  4429312
Size when opened:  951

Windows 10的File窗口显示"test.lnk“的大小为951字节,"sdktool.lnk”的大小为1325个字节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53411886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档