QT读取文件夹大小

根据文件夹路径,得到子文件及子文件夹信息,递归调用获得所有子文件大小并累加。
代码比较简单:
quint64 MessagesWidget::dirFileSize(const QString &path)
{
QDir dir(path);
quint64 size = 0;
//dir.entryInfoList(QDir::Files)返回文件信息
foreach(QFileInfo fileInfo, dir.entryInfoList(QDir::Files))
{
//计算文件大小
size += fileInfo.size();
}
//dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot)返回所有子目录,并进行过滤
foreach(QString subDir, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot))
{
//若存在子目录,则递归调用dirFileSize()函数
size += dirFileSize(path + QDir::separator() + subDir);

}
return size;
}

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Qt中使用zlib进行文件压缩和解压缩,可以借助于zlib库提供的函数来实现。 以下是一个简单的示例代码: ```c++ #include <QtCore/QDir> #include <QtCore/QFile> #include <QtCore/QByteArray> #include <QtCore/QDataStream> #include "zlib.h" // 压缩文件 bool compressFolder(const QString &folderPath, const QString &zipFilePath) { QFile zipFile(zipFilePath); if (!zipFile.open(QIODevice::WriteOnly)) { return false; } // 创建zlib压缩流 z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; if (deflateInit(&stream, Z_DEFAULT_COMPRESSION) != Z_OK) { return false; } // 遍历文件 QDir folder(folderPath); QStringList fileList = folder.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); for (const QString &fileName : fileList) { QString filePath = folder.filePath(fileName); if (QFileInfo(filePath).isDir()) { // 如果是文件,递归压缩 if (!compressFolder(filePath, zipFilePath)) { deflateEnd(&stream); return false; } } else { // 如果是文件,进行压缩 QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { deflateEnd(&stream); return false; } // 写入文件头 QByteArray fileNameData = fileName.toUtf8(); qint32 fileNameSize = fileNameData.size(); QByteArray fileSizeData = QByteArray::number(file.size()); qint32 fileSizeSize = fileSizeData.size(); zipFile.write(reinterpret_cast<const char*>(&fileNameSize), sizeof(qint32)); zipFile.write(fileNameData); zipFile.write(reinterpret_cast<const char*>(&fileSizeSize), sizeof(qint32)); zipFile.write(fileSizeData); // 压缩文件数据 QByteArray data = file.readAll(); stream.next_in = reinterpret_cast<Bytef*>(data.data()); stream.avail_in = data.size(); QByteArray compressedData; compressedData.resize(data.size()); stream.next_out = reinterpret_cast<Bytef*>(compressedData.data()); stream.avail_out = compressedData.size(); while (true) { int result = deflate(&stream, Z_FINISH); if (result == Z_STREAM_END) { break; } else if (result != Z_OK) { deflateEnd(&stream); return false; } } compressedData.resize(stream.total_out); // 写入压缩后的数据 zipFile.write(compressedData); } } // 结束zlib压缩流 if (deflateEnd(&stream) != Z_OK) { return false; } return true; } // 解压缩文件 bool decompressFolder(const QString &zipFilePath, const QString &folderPath) { QFile zipFile(zipFilePath); if (!zipFile.open(QIODevice::ReadOnly)) { return false; } // 创建zlib解压缩流 z_stream stream; stream.zalloc = Z_NULL; stream.zfree = Z_NULL; stream.opaque = Z_NULL; if (inflateInit(&stream) != Z_OK) { return false; } // 创建文件 QDir folder; if (!folder.mkpath(folderPath)) { inflateEnd(&stream); return false; } // 读取文件头和数据 while (zipFile.pos() < zipFile.size()) { // 读取文件名长度 qint32 fileNameSize = 0; zipFile.read(reinterpret_cast<char*>(&fileNameSize), sizeof(qint32)); if (zipFile.error() != QFile::NoError) { break; } // 读取文件名 QByteArray fileNameData = zipFile.read(fileNameSize); if (zipFile.error() != QFile::NoError) { break; } QString fileName = QString::fromUtf8(fileNameData); // 读取文件大小长度 qint32 fileSizeSize = 0; zipFile.read(reinterpret_cast<char*>(&fileSizeSize), sizeof(qint32)); if (zipFile.error() != QFile::NoError) { break; } // 读取文件大小 QByteArray fileSizeData = zipFile.read(fileSizeSize); if (zipFile.error() != QFile::NoError) { break; } qint64 fileSize = fileSizeData.toLongLong(); // 读取压缩数据 QByteArray compressedData = zipFile.read(fileSize); if (zipFile.error() != QFile::NoError) { break; } // 解压缩数据 QByteArray data; data.resize(fileSize); stream.next_in = reinterpret_cast<Bytef*>(compressedData.data()); stream.avail_in = compressedData.size(); stream.next_out = reinterpret_cast<Bytef*>(data.data()); stream.avail_out = data.size(); while (true) { int result = inflate(&stream, Z_NO_FLUSH); if (result == Z_STREAM_END) { break; } else if (result != Z_OK) { inflateEnd(&stream); return false; } } // 写入文件数据 QString filePath = folder.filePath(fileName); QFile file(filePath); if (!file.open(QIODevice::WriteOnly)) { inflateEnd(&stream); return false; } file.write(data); file.close(); } // 结束zlib解压缩流 if (inflateEnd(&stream) != Z_OK) { return false; } return true; } ``` 使用示例: ```c++ QString folderPath = "C:/TestFolder"; QString zipFilePath = "C:/TestFolder.zip"; // 压缩文件 if (compressFolder(folderPath, zipFilePath)) { qDebug() << "Folder compressed."; } else { qDebug() << "Failed to compress folder."; } // 解压缩文件 QString unzipFolderPath = "C:/UnzipFolder"; if (decompressFolder(zipFilePath, unzipFolderPath)) { qDebug() << "Folder decompressed."; } else { qDebug() << "Failed to decompress folder."; } ``` 需要注意的是,该示例代码仅支持压缩和解压缩文件大小不超过2GB的文件和文件。如果需要支持更大的文件和文件,可以将文件数据分块进行压缩和解压缩。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值