【问题标题】:RubyZip set file timestampsRubyZip 设置文件时间戳
【发布时间】:2018-05-10 19:39:36
【问题描述】:

我整天都在为此头疼,也许你能帮忙? 我正在使用 RubyZip 压缩文件,我需要将该文件的创建/更新/修改时间设置为时区中的某个时间(这取决于我在 @time_zone 变量中拥有的客户端时区)。

我知道这很可能是非常不正确的,我从 RubyZip 测试文件中获取了那个魔术字符串 'UT\x5\0\x3\250$\r@Ux\0\0',但我不知道这是什么。哈哈。 但是 - 我现在已经让它在我的电脑上工作了。它确实会压缩文件并根据指定的时区为其设置正确的时间戳。

但是 - 它不适用于应用服务器,因为操作系统时区位于 UTC 时区。它会为不匹配的文件生成其他时间。

这是我做到了多少:

def save_to_zip(file_path)
  Zip::OutputStream.open(file_path) do |out|
    @sheets.each do |csv|
      name = csv.name
      extra = time_for_zip
      out.put_next_entry("#{name}.#{@file_extension}", nil, extra)
      tmpfile = csv.tmpfile
      tmpfile.close
      source = File.open(tmpfile.path, 'r')
      source.each do |line|
        out.write(line)
      end
    end
  end
end

def time_for_zip
  return nil if @time_zone.blank?

  timestamp = Zip::ExtraField.new('UT\x5\0\x3\250$\r@Ux\0\0')
  localtime_str = Time.now.in_time_zone(@time_zone).strftime("%Y-%m-%dT%H:%M:%S")
  dos_time_in_store_tz = ::Zip::DOSTime.parse(localtime_str)

  timestamp['UniversalTime'].ctime = dos_time_in_store_tz
  timestamp['UniversalTime'].atime = dos_time_in_store_tz
  timestamp['UniversalTime'].mtime = dos_time_in_store_tz

  timestamp
end

您能告诉我如何在 zip 文件中正确设置文件时间吗?

非常感谢...

马里斯

【问题讨论】:

    标签: ruby-on-rails ruby rubyzip


    【解决方案1】:

    这样解决:

        def save_to_zip(file_path)
      Zip::OutputStream.open(file_path) do |out|
        @sheets.each do |csv|
          name = csv.name
          tmpfile = csv.tmpfile
          tmpfile.close
          source = File.open(tmpfile.path, 'r')
          zip_entry = Zip::Entry.new(out, "#{name}.#{@file_extension}", nil, nil, nil, nil, nil, nil, time_for_zip(source.ctime))
          out.put_next_entry(zip_entry)
          source.each do |line|
            out.write(line)
          end
        end
      end
    end
    
    def time_for_zip(file_time)
      return Zip::DOSTime.at(file_time) if @time_zone.blank?
    
      Zip::DOSTime.parse(file_time.utc.in_time_zone(@time_zone).strftime("%Y-%m-%d %H:%M:%S"))
    end
    

    感谢这个帖子:https://github.com/rubyzip/rubyzip/pull/40

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2022-07-09
      相关资源
      最近更新 更多