我收到了关于我使用 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
所以我找到了解决我的问题的方法 - 但是还有另一个更好的解决方案吗?
在添加文件期间是否可以设置二进制标志?