rubyzip 未定义方法 `to_binary_dos_time' 用于
rubyzip undefined method `to_binary_dos_time' for
当我尝试使用写入模式打开 zip 文件时,记录了以下消息。
完整的错误信息:
undefined method `to_binary_dos_time' for 2017-05-30 15:07:21 +0530:Time
回溯:
["/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_entry.rb:286:in `write_local_entry'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:147:in `block in update_local_headers'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_entry_set.rb:35:in `each'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_entry_set.rb:35:in `each'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:145:in `update_local_headers'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:64:in `close'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:50:in `ensure in open'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:50:in `open'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:216:in `block in commit'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:324:in `on_success_replace'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:214:in `commit'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:242:in `close'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:92:in `open'",
"/app/zipper_job.rb:36:in `perform'",
我的代码如下。
path="#{Rails.root}"
new_zip_name= "#{Time.now.to_i.to_s}"
archive = File.join(path,new_zip_name)+'.zip'
Zip::ZipFile.open(archive, 'w') do |zipfile| #Code breaking on this line
#MY Code
end
任何帮助都适用!!
提前致谢。
我创建了名为 config/initializers/patch.rb.
的新文件
在其中添加了以下代码,这解决了问题。
Zip::DOSTime.instance_eval do
def now ; Zip::DOSTime.new() ; end
end
我取自here
的补丁
rubyzip 和 rzip 中的类似问题,当尝试将 zip 条目的日期时间更改为原始文件日期时间时:
zf = Zip::File.open("myzipfile.zip", Zip::File::CREATE)
e = zf.add("myfiletozip.txt","myfiletozip.txt") # will set the zipfile date to now
e.time = File.mtime("myfiletozip.txt") # will set it to the original file's
到目前为止一切顺利,但是当关闭 zip 文件时,过程失败并出现相同的错误。
问题在于“time=”在条目中创建了“额外”结构,然后对其进行进一步处理,并且该处理使用了缺失的方法。
但是为什么不设置时间就可以用呢?没有构建额外的结构,也没有使用缺少的方法。就这么简单。
to_binary_dos_time/日期出现在Gem:dos_time.rb
然而,它们似乎被 gem 程序错误引用,在我的例子中 entry.rb
我的规避。我只是将这两个方法复制到我的代码中,从 gem 模块 dos_time.rb 中提取出来。而且 - 奇迹 - 它有效。 gem 过程在本地找到它们并且很高兴。
但是,这个bug应该报告给作者,但我不知道如何。也许有人可以做到这一点?
def to_binary_dos_time
(sec / 2) +
(min << 5) +
(hour << 11)
end
def to_binary_dos_date
day +
(month << 5) +
((year - 1980) << 9)
end
# source copied out of entry.rb in rubizyp gem, in my case:
# c:\Ruby27-x64\lib\ruby\gems.7.0\gems\rubyzip-2.3.0\lib\zip\dos_time.rb
当我尝试使用写入模式打开 zip 文件时,记录了以下消息。
完整的错误信息:
undefined method `to_binary_dos_time' for 2017-05-30 15:07:21 +0530:Time
回溯:
["/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_entry.rb:286:in `write_local_entry'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:147:in `block in update_local_headers'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_entry_set.rb:35:in `each'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_entry_set.rb:35:in `each'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:145:in `update_local_headers'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:64:in `close'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:50:in `ensure in open'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_output_stream.rb:50:in `open'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:216:in `block in commit'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:324:in `on_success_replace'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:214:in `commit'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:242:in `close'",
"/usr/local/lib/ruby/gems/2.1.0/gems/rubyzip-0.9.9/lib/zip/zip_file.rb:92:in `open'",
"/app/zipper_job.rb:36:in `perform'",
我的代码如下。
path="#{Rails.root}"
new_zip_name= "#{Time.now.to_i.to_s}"
archive = File.join(path,new_zip_name)+'.zip'
Zip::ZipFile.open(archive, 'w') do |zipfile| #Code breaking on this line
#MY Code
end
任何帮助都适用!! 提前致谢。
我创建了名为 config/initializers/patch.rb.
的新文件在其中添加了以下代码,这解决了问题。
Zip::DOSTime.instance_eval do
def now ; Zip::DOSTime.new() ; end
end
我取自here
的补丁rubyzip 和 rzip 中的类似问题,当尝试将 zip 条目的日期时间更改为原始文件日期时间时:
zf = Zip::File.open("myzipfile.zip", Zip::File::CREATE)
e = zf.add("myfiletozip.txt","myfiletozip.txt") # will set the zipfile date to now
e.time = File.mtime("myfiletozip.txt") # will set it to the original file's
到目前为止一切顺利,但是当关闭 zip 文件时,过程失败并出现相同的错误。 问题在于“time=”在条目中创建了“额外”结构,然后对其进行进一步处理,并且该处理使用了缺失的方法。
但是为什么不设置时间就可以用呢?没有构建额外的结构,也没有使用缺少的方法。就这么简单。
to_binary_dos_time/日期出现在Gem:dos_time.rb 然而,它们似乎被 gem 程序错误引用,在我的例子中 entry.rb
我的规避。我只是将这两个方法复制到我的代码中,从 gem 模块 dos_time.rb 中提取出来。而且 - 奇迹 - 它有效。 gem 过程在本地找到它们并且很高兴。
但是,这个bug应该报告给作者,但我不知道如何。也许有人可以做到这一点?
def to_binary_dos_time
(sec / 2) +
(min << 5) +
(hour << 11)
end
def to_binary_dos_date
day +
(month << 5) +
((year - 1980) << 9)
end
# source copied out of entry.rb in rubizyp gem, in my case:
# c:\Ruby27-x64\lib\ruby\gems.7.0\gems\rubyzip-2.3.0\lib\zip\dos_time.rb