7z 压缩如何不保留文件路径

路径格式问题

  • “dir/readme.txt” << 保留路径
  • “./dir/readme.txt” << 只有文件
mkdir -p dr1/dr2/readme.txt
7z a out.zip 'dr1/dr2/readme.txt'

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2020-10-02 10:02:00 D....            0            0  dr1/dr2/readme.txt
------------------- ----- ------------ ------------  ------------------------
2020-10-02 10:02:00                  0            0  0 files, 1 folders

7z a out.zip './dr1/dr2/readme.txt'

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
2020-10-02 10:02:00 D....            0            0  dr1/dr2/readme.txt
2020-10-02 10:02:00 D....            0            0  readme.txt
------------------- ----- ------------ ------------  ------------------------
2020-10-02 10:02:00                  0            0  0 files, 2 folders
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Qt提供的zlib库来完成文件压缩。具体步骤如下: 1. 首先需要在Qt项目中添加zlib头文件和库文件,方法如下: 在.pro文件中添加: ``` LIBS += -lz ``` 在源代码中添加头文件: ```c++ #include "zlib.h" ``` 2. 创建一个压缩函数,传入需要压缩文件路径压缩后的文件路径作为参数: ```c++ bool compressFolder(const QString& folderPath, const QString& zipFilePath) { // 打开需要压缩文件夹 QDir dir(folderPath); if (!dir.exists()) { qDebug() << "Folder does not exist."; return false; } // 创建压缩文件 QFile zipFile(zipFilePath); if (!zipFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to create zip file."; return false; } // 初始化zlib z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; if (deflateInit(&strm, Z_DEFAULT_COMPRESSION) != Z_OK) { qDebug() << "Failed to initialize zlib."; return false; } // 遍历文件夹并将文件逐个压缩写入到压缩文件中 QFileInfoList fileList = dir.entryInfoList(QDir::NoDotAndDotDot | QDir::Files | QDir::Dirs); foreach (QFileInfo fileInfo, fileList) { if (fileInfo.isDir()) { // 如果是子文件夹,递归调用自己进行压缩 QString subFolderPath = fileInfo.absoluteFilePath(); QString subZipFilePath = zipFilePath + "/" + fileInfo.fileName() + ".zip"; if (!compressFolder(subFolderPath, subZipFilePath)) { return false; } } else { // 如果是文件,则读入文件压缩后写入到压缩文件中 QFile inputFile(fileInfo.absoluteFilePath()); if (!inputFile.open(QIODevice::ReadOnly)) { qDebug() << "Failed to open file:" << fileInfo.absoluteFilePath(); return false; } QByteArray inputData = inputFile.readAll(); inputFile.close(); QByteArray outputData; outputData.resize(inputData.size() * 1.1 + 12); strm.avail_in = inputData.size(); strm.next_in = (Bytef*)inputData.data(); strm.avail_out = outputData.size(); strm.next_out = (Bytef*)outputData.data(); int ret = Z_OK; while (strm.avail_in != 0 && ret == Z_OK) { ret = deflate(&strm, Z_NO_FLUSH); if (ret != Z_OK) { break; } if (strm.avail_out == 0) { outputData.resize(outputData.size() * 2); strm.avail_out = outputData.size() - strm.total_out; strm.next_out = (Bytef*)(outputData.data() + strm.total_out); } } while (ret == Z_OK) { if (strm.avail_out == 0) { outputData.resize(outputData.size() * 2); strm.avail_out = outputData.size() - strm.total_out; strm.next_out = (Bytef*)(outputData.data() + strm.total_out); } ret = deflate(&strm, Z_FINISH); } if (ret != Z_STREAM_END) { qDebug() << "Failed to compress file:" << fileInfo.absoluteFilePath(); return false; } outputData.resize(strm.total_out); zipFile.write(outputData); } } // 结束压缩并关闭文件 deflateEnd(&strm); zipFile.close(); return true; } ``` 这个函数会遍历传入的文件夹,如果遇到子文件夹则递归进行压缩,如果遇到文件则将文件读入内存,压缩后写入到压缩文件中。在压缩文件夹时,为了保留文件夹内部文件的后缀,我们可以将子文件压缩成以文件夹名为名字的.zip文件,而不是将全部文件压缩到一个.zip文件中。 注意,在压缩文件时,我们使用了zlib库提供的deflate函数进行压缩。这个函数可以将一个数据块压缩成另一个数据块,并返回压缩后的数据块。在这个函数中,我们需要提供输入数据和输出数据的缓冲区,以及两个缓冲区的大小。如果输出缓冲区不足以容纳压缩后的数据块,我们需要重新分配一个更大的输出缓冲区,并重新设置输出缓冲区的指针和大小。在压缩结束后,我们需要调用deflateEnd函数来释放zlib占用的资源。 3. 调用压缩函数进行压缩: ```c++ QString folderPath = "your/folder/path"; QString zipFilePath = "your/zip/file/path.zip"; if (compressFolder(folderPath, zipFilePath)) { qDebug() << "Compress folder succeeded."; } else { qDebug() << "Compress folder failed."; } ``` 这段代码会将指定文件压缩成指定的.zip文件,并输出压缩结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值