无法在QT C 中获得目录大小

Can not get directory size in QT C++

本文关键字:QT      更新时间:2023-10-16

cur_file.size return 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();
}

QIODevice::size()的QT文档:

如果设备关闭,返回的尺寸将无法反映设备的实际尺寸。

相关文章:
  • 没有找到相关文章