如何不解压读取嵌套Zip文件中的内容?
不解压到文件系统查看嵌套Zip内容的方法
你可以利用Zip::Entry的get_input_stream方法直接获取内层Zip文件的数据流,无需先将其提取到文件系统,再用Zip::File处理这个流即可查看内容。以下是具体实现代码:
require 'zip' # 打开外层Zip文件 Zip::File.open('outer.zip') do |outer_zip| # 找到目标内层Zip条目(这里以匹配第一个zip文件为例,可根据实际路径调整) inner_zip_entry = outer_zip.glob('**/*.zip').first next unless inner_zip_entry # 获取内层Zip的输入流,全程不写入文件系统 inner_zip_entry.get_input_stream do |stream| # 用Zip::File处理数据流,操作方式和普通Zip文件一致 Zip::File.open(stream) do |inner_zip| # 遍历内层Zip的所有条目 inner_zip.each do |entry| puts "内层文件名称:#{entry.name}" # 如果需要查看文件内容,可通过entry的输入流读取 entry.get_input_stream do |file_stream| puts "文件内容:\n#{file_stream.read}" end end end end end
关键说明
get_input_stream方法直接从外层Zip中读取内层Zip的二进制数据,完全跳过磁盘写入步骤,非常适合单元测试场景,避免不必要的IO开销- 处理内层流的方式和普通Zip文件完全一致,你可以根据需求遍历条目、读取指定文件内容,或者做其他验证操作
补充:这种嵌套Zip的结构是Apple Wallet批量添加票据的要求,并非无意义的压缩嵌套。
内容的提问来源于stack exchange,提问作者masukomi
相关产品推荐
相关产品推荐

