[英]RubyZip set file timestamps
I have been banging my head the whole day on this, maybe you can help? 我整天都在为此而烦恼,也许您能帮上忙吗? I am zipping the file with RubyZip and I need to set the time of that file creation/update/modification to the certain time in time zone (which depends on the client time zone I have in the
@time_zone
variable). 我使用RubyZip压缩文件,我需要将该文件的创建/更新/修改时间设置为时区中的特定时间(这取决于我在
@time_zone
变量中拥有的客户端时区)。
I know it is most likely super incorrect, and I have taken that magic string 'UT\\x5\\0\\x3\\250$\\r@Ux\\0\\0'
from the RubyZip tests file, and I have no idea what this is. 我知道这很可能是超级错误,我从RubyZip测试文件中获取了魔术字符串
'UT\\x5\\0\\x3\\250$\\r@Ux\\0\\0'
,但我不知道这是什么。 LOL. 大声笑。 However - I have made it work now on my PC.
但是-我现在可以在PC上运行它。 It really zips the file and sets the correct timestamps for it according to the specified time zone.
它实际上会压缩文件并根据指定的时区为其设置正确的时间戳。
BUT - it doesn't work on the app server, which as OS time zone is in UTC time zone. 但是-它在应用服务器上不起作用,因为OS时区位于UTC时区。 It generates some other time for files which doesn't match.
它为不匹配的文件生成其他时间。
Here's how far I made it work: 这是我使它起作用的程度:
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
Can you please tell me how can I set the file time correctly inside the zip file? 您能告诉我如何在zip文件中正确设置文件时间吗?
Really appreciated... 非常感谢...
Maris 马里斯
Solved like this: 像这样解决:
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
Kudos to this thread: https://github.com/rubyzip/rubyzip/pull/40 对此线程的荣誉: https : //github.com/rubyzip/rubyzip/pull/40
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.