我收到了一封关于我用rubyzip 1.2.0创建的zip文件的抱怨:
text.pdf的文本标志在解压缩后损坏了pdf。
我在windows下创建zip,收件人使用Unix / Linux。
您可以看到zipinfo
(或unzip -Z
带有窗口)的标记。
unzip -Z -l test.zip
结果为:
Archive: test.zip
Zip file size: 1666 bytes, number of entries: 2
-rw---- 5.2 fat 1521 t- 730 defN 16-Sep-30 23:37 test.dtx
-rw---- 5.2 fat 1521 t- 730 defN 16-Sep-30 23:37 test.pdf
2 files, 3042 bytes uncompressed, 1460 bytes compressed: 52.0%
+
+--- This is the t-flag
这是相关的测试代码:
require "zip"
###add here my patch####
Zip::File.open('test.zip', Zip::File::CREATE) do |zipfile|
%w{
test.dtx
test.pdf
}.each{|filename|
file = begin
#I use __FILE__, so you can run this example out of the box.
#My original code uses the dtx and pdf file.
zipfile.add(filename, __FILE__) #Zip::ZipEntryExistsError if already in zip
rescue Zip::EntryExistsError
zipfile.replace(filename, __FILE__)
end
#This is part of my work around
file.internal_file_attributes = 0 if filename =~ /pdf$/ and file.respond_to?(:internal_file_attributes)
}
end #Zip::ZipFile.open
我检查了Zip::Entry的源代码并找到了它的定义
@internal_file_attributes = 1
,但不可能影响这个价值。
根据这些信息,我做了一个补丁Zip :: Entry,如下所示:
module Zip
class Entry
#my work around to set @internal_file_attributes
attr_accessor :internal_file_attributes
end
end
当我在上面的测试代码中添加此补丁时,我得到:
Archive: test.zip
Zip file size: 1726 bytes, number of entries: 2
-rw---- 5.2 fat 1666 t- 760 defN 16-Sep-30 23:40 test.dtx
-rw---- 5.2 fat 1666 b- 760 defN 16-Sep-30 23:40 test.pdf
2 files, 3332 bytes uncompressed, 1520 bytes compressed: 54.4%
+
+--- There is a b-flag for the pdf
所以我找到了解决问题的方法 - 但还有另一个更好的解决方案吗?
是否有可能在添加文件时设置二进制标志?