2

我收到了关于我使用 ruby​​zip 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

所以我找到了解决我的问题的方法 - 但是还有另一个更好的解决方案吗?

在添加文件期间是否可以设置二进制标志?

4

0 回答 0