我正在使用C++,Boost和Qt开发一个项目.我理解如何使用例如Qt中的qCompress()函数压缩单个文件和字节流.
如何压缩多个文件的目录,包括子目录?我正在寻找一个跨平台(Mac,Win,Linux)解决方案; 我宁愿不发动一堆新进程.
有没有一种标准方法可以将多个文件中的字节流组合成一个压缩存档,或者Boost iostream库中是否有可用的便捷功能或方法?
非常感谢您的帮助.
更新:QuaZip库看起来非常棒.下载包中的一个示例(在"tests"目录中)非常清楚地显示了如何压缩文件目录.
更新2:在我的Linux构建环境中完成此任务后,我发现QuaZip在Visual Studio编译器中根本不起作用.有可能解决所有这些编译器错误,但对任何看不起这条路径的人都要谨慎.
所以这就是问题所在.我有sample.gz文件,大小约为60KB.我想解压缩此文件的前2000个字节.我正在运行CRC校验失败错误,我猜因为gzip CRC字段出现在文件的末尾,它需要整个gzip文件进行解压缩.有办法解决这个问题吗?我不关心CRC检查.即使我因CRC错误而无法解压缩,也没关系.有没有办法绕过这个并解压缩部分.gz文件?
我到目前为止的代码是
import gzip
import time
import StringIO
file = open('sample.gz', 'rb')
mybuf = MyBuffer(file)
mybuf = StringIO.StringIO(file.read(2000))
f = gzip.GzipFile(fileobj=mybuf)
data = f.read()
print data
Run Code Online (Sandbox Code Playgroud)
遇到的错误是
File "gunzip.py", line 27, in ?
data = f.read()
File "/usr/local/lib/python2.4/gzip.py", line 218, in read
self._read(readsize)
File "/usr/local/lib/python2.4/gzip.py", line 273, in _read
self._read_eof()
File "/usr/local/lib/python2.4/gzip.py", line 309, in _read_eof
raise IOError, "CRC check failed"
IOError: CRC check failed
Run Code Online (Sandbox Code Playgroud)
还有什么方法可以使用zlib模块执行此操作并忽略gzip标头?
我正在寻找使用自定义VFS实现和自定义IO方法实现的透明SQLite 3 zlib压缩的现有解决方案.
是否有人知道现有的项目已经这样做了,还是我必须自己动手?我依稀记得在一年前看到类似的东西,但再也找不到了.
我已经开始使用zlib 1.2.5了,我没有看到从zip文件中提取的任何例程?我读到了一个minizip应用程序,这是发行版的一部分.
这是应该怎么做的?
我在将一堆文件打包到一个档案中时遇到了麻烦.这个主题的提升文档是非常有限的,我现在在网上搜索了几个小时,但我找不到解决方案.
到目前为止我有什么:
boost::filesystem::ofstream ofsArchive("some.zip");
boost::iostreams::filtering_ostreambuf outFilter;
boost::iostreams::zlib_params zparam(boost::iostreams::zlib::default_compression);
try
{
// set up the filter
outFilter.strict_sync();
outFilter.push(boost::iostreams::zlib_compressor(zparam));
outFilter.push(ofsArchive);
for(each object of some kind)
{
// create a binary serialized file
boost::filesystem::ofstream ofs(filename, std::ios_base::binary);
boost::archive::binary_oarchive bin_oa( ofs );
bin_oa << crazyObject;
// here's where i'm stuck. how to add multiple files to the "some.zip"?
boost::iostreams::copy(ofs, outputArchive);
}
}
catch(boost::iostreams::zlib_error& e){...}
Run Code Online (Sandbox Code Playgroud)
如何将文件添加到zip存档?提供的方法显然不起作用,我只是在文档或头文件中找不到任何关于主题的内容
我只是想设置一个新的应用程序,我希望利用ASIHTTPRequest框架.但是在他们的文档中, 他们声明你必须链接CFNetwork,SystemConfiguration,MobileCoreServices,CoreGraphics和zlib框架.唯一的问题是没有zlib框架..他们是libz.dylib文件,但他们是其中几个,我不确定哪些是合适的,如果有人可以请让我知道该怎么做这将是真棒!
我以前使用MiniZip(zlib包装器)来解压缩档案.MiniZip不能用于Metro应用程序,因为它在"iowin32.c"中使用了弃用的API - CreateFile()和SetFilePointer().
我认为这将是一个简单的修复,并创建"iowinrt.c"与CreateFile()和SetFilePointer()替换为CreateFile2()和SetFilePointerEx().虽然这样我获得了一个只使用经过批准的Win8 API的MiniZip版本,但它仍然没用 - 我忘记了沙盒.如果我使用FileOpenPicker()选择一个文件并将其路径传递给我修改过的MiniZip,我仍然无法打开它 - CreateFile2()将因"访问被拒绝"而失败.信息.
所以看起来旧的C API用于文件访问,如果现在几乎无用; 我的理解是,为了解决这个问题,我需要使用新的异步文件访问在C++/CX中重新实现我的"iowinrt".还有其他选择吗?我想我在某处看到WinRT确实具有压缩/解压缩功能,但它只适用于单个文件,而不适用于存档.
我需要它在内存中工作的附加要求.
有一会儿,我以为我有一个通过.NET Framework 4.5的解决方案:
我发现了这条关于如何创建可以在C++/CX中使用的.NET类的信息:http: //social.msdn.microsoft.com/Forums/en-US/winappswithnativecode/thread/3ff383d0-0c9f-4a30- 8987-ff2b23957f01
.NET Framework 4.5在System.IO.Compression中包含ZipArchive和ZipArchiveEntry类:http: //msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx# Y0 http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry%28v=vs.110%29.aspx#Y0
我以为我可以使用WinMD输出类型创建C#Metro类库,公开ZipArchive和ZipArchiveEntry,然后在我的C++/CX项目中使用它.但是,即使它起作用,也不会在内存中起作用; ZipArchive和ZipArchiveEntry似乎只适用于文件.
我首先尝试安装josegonzalez/homebrew-php.它在zlib安装时失败了.然后我尝试安装zlib,它以同样的方式失败了.以下是错误.任何帮助将不胜感激.
Indatuss-MacBook-Pro-7% brew install zlib
==> Downloading http://zlib.net/zlib-1.2.8.tar.gz
Already downloaded: /Library/Caches/Homebrew/zlib-1.2.8.tar.gz
==> Patching
patching file configure
==> ./configure --prefix=/usr/local/Cellar/zlib/1.2.8
==> make install
make: *** [inflate.o] Error 1
1 error generated.
make: *** [trees.o] Error 1
1 error generated.
make: *** [deflate.o] Error 1
Run Code Online (Sandbox Code Playgroud)
不确定是什么导致了这个错误,或者更不用说如何解决它.
我是过时的帝国时代II(AoE)游戏的粉丝.我想用Python编写AoE游戏记录(.mgx文件)的解析器.
我在GitHub上做了一些搜索并发现了很少的项目,最有用的是aoc-mgx格式,它提供了.mgx游戏记录文件的一些细节.
这是问题所在:
根据参考文献,.mgx文件的结构如下:
| header_len(4byte int)| next_pos(4byte int)| header_data | ...... |
十六进制数据的mgx格式的字节顺序是小端.
header_len存储Header部分的数据长度(header_len + next_post + header_data)
header_data存储我需要的有用信息,但它用zlib压缩
我试图用zlib模块解压缩header_data中的数据,如下所示:
import struct
import zlib
with open('test.mgx', "rb") as fp:
# read the header_len bytes and covert it to a int reprents length of Header part
header_len = struct.unpack("<i", fp.read(4))[0]
# read next_pos (this is not important for me)
next_pos = struct.unpack("<i", fp.read(4))[0]
# then I …Run Code Online (Sandbox Code Playgroud) 我最近一直在使用CloudFlare优化的zlib,结果非常令人印象深刻.
不幸的是,他们似乎已经假设zlib的开发被放弃了,他们的分叉也就此消失了.我最终能够手动将他们的更改改为当前的zlib开发分支,尽管这是一个真正的痛苦.
无论如何,我还没有能够利用CloudFlare代码中的一个主要优化,即使用新的(Haswell和后来的,我相信)英特尔处理器中包含的PCLMULQDQ无进位乘法指令实现的快速CRC32代码,因为:
我在Mac上,并没有clang集成汇编程序或Apple的古代GAS都不了解所用的新GAS助记符,以及
代码从Linux内核中取出并且是GPL2,这使得整个库GPL2,从而基本上使它对我的目的无用.
所以我做了一些狩猎,几个小时之后我偶然发现了一些Apple在他们的bzip2中使用的代码:arm64和x86_64的手写,矢量化CRC32实现.
奇怪的是,x86_64程序集的注释(仅)在arm64源代码中,但它似乎表明此代码可以与zlib一起使用:
This function SHOULD NOT be called directly. It should be called in a wrapper
function (such as crc32_little in crc32.c) that 1st align an input buffer to 16-byte (update crc along the way),
and make sure that len is at least 16 and SHOULD be a multiple of 16.
Run Code Online (Sandbox Code Playgroud)
但不幸的是,经过几次尝试,此时我似乎有点过头了.而且我不确定如何真正做到这一点.所以我希望有人能告诉我如何/在哪里调用所提供的功能.
(如果有一种方法可以在运行时检测到必要的功能,并且如果硬件功能不可用则可以回退到软件实现,这也是很棒的,所以我不必分发多个二进制文件. ,至少,如果有人可以帮助我了解如何让库正确使用基于Apple PCLMULQDQ的CRC32,那么无论如何都会有很长的路要走.)