c++ - 无法在 QT C++ 中获取目录大小

标签 c++ qt

cur_file.size 返回0,我该如何解决这个问题?

void MainWindow::setDirectory() {
QString directory_way = QFileDialog::getExistingDirectory(0, "Choose directory: ", "");
QFile cur_file(directory_way);
QFile fileOut("fileout.txt");
if(fileOut.open(QIODevice::WriteOnly | QIODevice::Text))
{
        QTextStream writeStream(&fileOut);
        writeStream << "You chose directory: " << directory_way <<" with size " << cur_file.size();
        fileOut.close();
}}

最佳答案

QFile::size() 只能用于文件,不能计算目录的大小。 Qt 不提供开箱即用的功能来完成后者,但是编写自己的递归函数并不难,该函数遍历目录的文件和目录,并添加它们的大小...

这是一个完整的例子:

#include <QtWidgets>

qint64 dirSize(QString dirPath) {
    qint64 size = 0;
    QDir dir(dirPath);
    //calculate total size of current directories' files
    QDir::Filters fileFilters = QDir::Files|QDir::System|QDir::Hidden;
    for(QString filePath : dir.entryList(fileFilters)) {
        QFileInfo fi(dir, filePath);
        size+= fi.size();
    }
    //add size of child directories recursively
    QDir::Filters dirFilters = QDir::Dirs|QDir::NoDotAndDotDot|QDir::System|QDir::Hidden;
    for(QString childDirPath : dir.entryList(dirFilters))
        size+= dirSize(dirPath + QDir::separator() + childDirPath);
    return size;
}

QString formatSize(qint64 size) {
    QStringList units = {"Bytes", "KB", "MB", "GB", "TB", "PB"};
    int i;
    double outputSize = size;
    for(i=0; i<units.size()-1; i++) {
        if(outputSize<1024) break;
        outputSize= outputSize/1024;
    }
    return QString("%0 %1").arg(outputSize, 0, 'f', 2).arg(units[i]);
}

int main(int argc, char* argv[]) {
    QApplication a(argc, argv);

    QString directoryPath = QFileDialog
            ::getExistingDirectory(nullptr, "Choose directory: ", "");
    //calculate and output selected directory size
    qint64 size = dirSize(directoryPath);
    qInfo() << formatSize(size);

    QTimer::singleShot(0, &a, &QApplication::quit);
    return a.exec();
}

关于c++ - 无法在 QT C++ 中获取目录大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47854288/

相关文章:

c++ - 为什么我可以传递这样的字符串参数?这种风格安全吗?

c++ - 奇怪的光线追踪伪影

c++ - 通过 QDataStream 读取/写入字节数组

qt - 如何在布局中的项目上使用 ColorOverlay?

c++ - 使用 Qt 信号和槽与直接调用方法

c++ - 将 vector 中的数字放到 vector<vector>> 中,两个数字的差值为 1

c++ - 如何在 boost::dynamic_bitset<> 中查找第一次和最后一次出现

c++ - 我可以将反向迭代器转换为正向迭代器吗?

qt - 使用 N 个点创建弯曲路径

c++ - 通过 Visual C++ (API) 访问 Powershell