QDirIterator跳过文件

时间:2018-07-12 19:00:24

标签: c++ windows qt

基本上,我这样做:

检查C:\ Windows目录属性: 大小:22.6 GB(24,281,251,244字节),文件:154,028个文件

然后,使用以下代码,我尝试获得相同的数字:

inline uint64_t file_size(std::string fname)
{
    std::ifstream ifs(fname, std::ifstream::ate | std::ifstream::binary);
    return ifs.tellg();
}
...
QDirIterator it (path_, QDir::Files | QDir::Hidden | QDir::System , QDirIterator::Subdirectories | QDirIterator::FollowSymlinks);
while (it.hasNext())
{
    QFileInfo info(it.next());
    // QFileInfo::size is messed up for *.lnk files, had to improvise
    uint64_t size;
    if (info.isSymLink())
        size = file_size(info.absoluteFilePath().toStdString());
    else
        size = info.size();

    current_sz_desc_.full_size_ += size;
    current_sz_desc_.file_count_ ++;
}

我得到的是:21,788,122,091字节,文件:148823

它适用于所有用户创建的目录,但是对于某些系统目录(Program Files,Windows等)却无法正常工作。怎么了?

1 个答案:

答案 0 :(得分:0)

您好,我在这里通过您共享的代码假设您有足够的经验来了解我所做的事情,并且能够根据自己的想法来复制该概念(我并没有完全编写需要看的代码。 http://doc.qt.io/qt-5/qstorageinfo.html#bytesTotal | http://doc.qt.io/archives/qt-4.8/qdir.html (请尽量保持简单,脚本的复杂度应等于所要求任务的复杂度)任何目录(包括程序文件系统)但不包含隐藏目录

int count = 0 ;
QString Root ;

 void MyFunction()
{
    QStorageInfo storage = QStorageInfo::root() ;

    qDebug() << storage.rootPath();
    /*bytes will be only once /1000 not /1000/1000*/
    qDebug() << "size:" << storage.bytesTotal()/1000/1000 << "MB"; 
    qDebug() << "name:" << storage.name();
    qDebug() << "fileSystemType:" << storage.fileSystemType();
    qDebug() << "availableSize:" << storage.bytesAvailable()/1000/1000 << "MB";

    Root = storage.rootPath() ; 

    QDirIterator Load_Path(Root, QDirIterator::Subdirectories) ;

    do
    {
      count = count + 1 ;
      qDebug() << count ; 
    }while(Load_Path.hasNext()) ;
}