Qt5压缩解压缩文件/夹

这篇博客介绍了在Qt5环境下如何实现文件和文件夹的压缩与解压缩。由于缺乏直接支持全文件夹压缩的C/C++库,作者选择自行遍历文件并定义压缩格式。虽然不是标准的压缩格式,但足够满足个人需求。文中强调了压缩算法的重要性,并提到Qt5可以用于简单实现这一功能。测试代码经过MD5验证。

全网居然没找到一个能直接压缩整个文件夹的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();
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值