全网居然没找到一个能直接压缩整个文件夹的c/c++库,就算找到了zlib,karchive,archive等开源库,基本也是在Linux下支持的较好,在win下只有zlib还算是编译过了。而且不能全文件夹压缩的,都是buffer或者单文件压缩,这就好奇了,标准zip怎么搞?原来zip是有一个特定archive的,链接在此。
由此思路,如果自己要压缩文件夹,那就自己遍历,然后自己定义压缩文件的格式就好了,当然不是标准化的压缩格式而已了。但是够自己使用就行。这么理解,实现文件夹的压缩就显得不那么重要了,重要的是压缩算法,而提供压缩算法的库就多了去了,也容易找到。下面就用qt5简单实现一个文件的压缩与解压缩。注意,没有全文件一次读取再压缩,是考虑到文件太大,比如4g,会直接冲爆你的内存。下面测试代码已使用MD5验证通过。show code:
#include <QCoreApplication>
#include <QFile>
#include <QDataStream>
#include <QDebug>
#define READ_BUFFER 10240
bool compress(QString ifile, QString ofile)
{
QFile file(ifile);
QFile output(ofile);
if(file.open(QFile::ReadOnly) &&
output.open(QFile::WriteOnly|QFile::Truncate))
{
QDataStream ds(&output);
while(!file.atEnd())
{
QByteArray read = file.read(READ_BUFFER);
QByteArray comp = qCompress(read);
int nsize = comp.size();
ds<<nsize<<comp;
qDebug()<<"Input:"<<nsize;
}
output.close();
file.close();
return true;
}
return false;
}
bool uncompress(QString ifile, QString ofile)
{
QFile file(ifile);
QFile output(ofile);
if(file.open(QFile::ReadOnly) &&
output.open(QFile::WriteOnly|QFile::Truncate))
{
QDataStream ds(&file);
QByteArray read;
while(!file.atEnd())
{
int size;
ds>>size>>read;
qDebug()<<"out:"<<size;
QByteArray comp = qUncompress(read);
output.write(comp);
}
output.close();
file.close();
return true;
}
return false;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug()<<"compress....";
compress("data.db", "data.zip");
//
qDebug()<<"uncompress....";
uncompress("data.zip", "dt.db");
return a.exec();
}
这篇博客介绍了在Qt5环境下如何实现文件和文件夹的压缩与解压缩。由于缺乏直接支持全文件夹压缩的C/C++库,作者选择自行遍历文件并定义压缩格式。虽然不是标准的压缩格式,但足够满足个人需求。文中强调了压缩算法的重要性,并提到Qt5可以用于简单实现这一功能。测试代码经过MD5验证。

1830

被折叠的 条评论
为什么被折叠?



