QDirIterator 跳过文件

Posted

技术标签:

【中文标题】QDirIterator 跳过文件【英文标题】:QDirIterator skips files 【发布时间】:2018-07-12 19:00:24 【问题描述】:

基本上,我是这样做的:

检查 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

它适用于所有用户创建的目录,但不知何故不适用于系统目录(程序文件、Windows 等)。怎么了?

【问题讨论】:

【参考方案1】:

您好,我在这里假设您分享的代码有足够的经验来了解我所做的并且能够为您自己的想法重现这个概念(我没有将完整的代码放在它需要看到的地方。 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()) ;

【讨论】:

使用 QDir::Hidden 我没有调试输出,甚至我想生成的文件也没有创建(在我的完整脚本中我记录所有路径) 与 QDir::AllEntries 没有给出隐藏路径我只是测试它 我想知道你知道 recycle.bin 是隐藏路径,但是要从 cmd 访问它或什至在此路径中执行某些操作,你需要管理员权限,可能与程序相同,因为我仍然没有足够的权限看起来我认为是导致行'QDirIterator Load_Path(Root,QDirIterator :: Subdirectories);'从根目录中查找任何目录,因此它应该像我说的那样显示它们,我认为这更像是一种特权问题,我也阅读并尝试了大部分 QDir 和 QDirIterator 并且没有关于隐藏文件的任何内容 我没有在隐藏的文件夹文件等上找到任何东西,或者它是一个特权问题,或者那是我在外面吸烟时(5 分钟前)在想,如果它隐藏它隐藏它意味着找不到或弄乱 嗯,我用管理员权限试过了,没用。

以上是关于QDirIterator 跳过文件的主要内容,如果未能解决你的问题,请参考以下文章

QT 读取文件夹下所有文件(超级简单的方法,不需要QDirIterator)

关于Enumeration和Iterator的区别.

openpyxl iter_rows() 是不是跳过最后一行?

为啥 takewhile() 会跳过第一行?

istream_iterator && istream_iteratorbuf

ES6 系列八:Iterator