如何在目录遍历中获取文件大小?

Dmi*_*try 6 c++ qt

当我使用递归查看每个文件时,如何获取文件的大小?我收到了下一个错误:

project.exe已退出,代码为-1073741819

int dir_size(const QString _wantedDirPath)
{
    long int sizex = 0;
    QFileInfo str_info(_wantedDirPath);
    if (str_info.isDir())
    {
        QDir dir(_wantedDirPath);
        QStringList ext_list;
        dir.setFilter(QDir::Files | QDir::Dirs |  QDir::Hidden | QDir::NoSymLinks);
        QFileInfoList list = dir.entryInfoList();

        for(int i = 0; i < list.size(); ++i)
        {
            QFileInfo fileInfo = list.at(i);
            if ((fileInfo.fileName() != ".") && (fileInfo.fileName() != ".."))
            {
                sizex += (fileInfo.isDir()) ? this->dir_size(fileInfo.path()) : fileInfo.size():
                QApplication::processEvents();
            }
        } 
    } 

    return sizex;
}
Run Code Online (Sandbox Code Playgroud)

cor*_*tin 8

首先清理一下代码.

quint64 dir_size(const QString & str)
{
    quint64 sizex = 0;
    QFileInfo str_info(str);
    if (str_info.isDir())
    {
        QDir dir(str);
        QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::Dirs |  QDir::Hidden | QDir::NoSymLinks | QDir::NoDotAndDotDot);
        for (int i = 0; i < list.size(); ++i)
        {
            QFileInfo fileInfo = list.at(i);
            if(fileInfo.isDir())
            {
                    sizex += dir_size(fileInfo.absoluteFilePath());
            }
            else 
                sizex += fileInfo.size();

        }
    }
    return sizex;
} 
Run Code Online (Sandbox Code Playgroud)

如果你想保持ui被动,在一个单独的线程中进行计算,在每个文件中调用processEvent()是一个负担.你还应该使用quint64(unsigned long long)来处理大文件(> 2Go)但是,目前还不清楚崩溃的位置.


blu*_*kin 1

它崩溃是因为您一次又一次递归地评估同一个文件夹。该语句sizex += this->dir_size(fileInfo.path());使用相同的文件夹名称递归调用相同的函数。所以你的堆栈不断增长并最终耗尽内存。

fileInfo.path()给出相同的(父)文件夹。

fileInfo.filePath()给出带有路径的文件名

将其更改为 sizex += this->dir_size(fileInfo.filePath());,应该可以修复它