Ruby on rails 3.1 如何使用rubyzip重命名zip文件中的文件和目录

Ruby on rails 3.1 如何使用rubyzip重命名zip文件中的文件和目录,ruby-on-rails-3.1,ruby-1.9.2,rubyzip,Ruby On Rails 3.1,Ruby 1.9.2,Rubyzip,我正在尝试重命名zip中的文件和目录。我试过三种不同的方法,都不管用。正确的命令是什么 以下是我的代码摘录: require 'zip/zip' ... def renaming_zip(zip_file) Zip::ZipFile.open(zip_file).each do |entry| if entry.name == "mimetype" puts "#{entry.name} is a file ? #{File.file? entry.name}

我正在尝试重命名zip中的文件和目录。我试过三种不同的方法,都不管用。正确的命令是什么

以下是我的代码摘录:

require 'zip/zip'
...

def renaming_zip(zip_file)
  Zip::ZipFile.open(zip_file).each do |entry|

      if entry.name == "mimetype"
        puts "#{entry.name} is a file ? #{File.file? entry.name}"
        puts " class ? #{entry.class}"
        new_filename = "#{entry.name.gsub("mimetype", "#mimetype-new")}"
        #found_entry = entry.get_entry("mimetype")
        #found_entry.name = new_filename                               #1st try
        puts  " new filename  #{new_filename}"
        #File.rename(entry.name, new_filename)                         #2nd try
        #entry.rename(entry.name, new_filename)                   #3rd try
      end
  end
end
如果我在没有任何重命名试用命令的情况下执行,我会得到这个输出,这样您就可以看到该文件存在于zip中。它不是一个文件类,而是一个Zip::ZipEntry类,我能够解析新名称

mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
第一次尝试(未注释)时,我得到以下错误:

mimetype is a file ? false
class ? Zip::ZipEntry
Uncaught exception: undefined method `get_entry' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:45:in `block in renaming_zip'
...
Uncaught exception: No such file or directory - (mimetype, #mimetype-new)
/Users/.../app/lib/zip_rename.rb:48:in `rename'
/Users/.../app/lib/zxp_rename.rb:48:in `block in renaming_zip'
...
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
Uncaught exception: undefined method `rename' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:49:in `block in renaming_zip'
    ...
第二次尝试(未注释)时,我出现以下错误:

mimetype is a file ? false
class ? Zip::ZipEntry
Uncaught exception: undefined method `get_entry' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:45:in `block in renaming_zip'
...
Uncaught exception: No such file or directory - (mimetype, #mimetype-new)
/Users/.../app/lib/zip_rename.rb:48:in `rename'
/Users/.../app/lib/zxp_rename.rb:48:in `block in renaming_zip'
...
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
Uncaught exception: undefined method `rename' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:49:in `block in renaming_zip'
    ...
第三次尝试(未注释)时,我出现以下错误:

mimetype is a file ? false
class ? Zip::ZipEntry
Uncaught exception: undefined method `get_entry' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:45:in `block in renaming_zip'
...
Uncaught exception: No such file or directory - (mimetype, #mimetype-new)
/Users/.../app/lib/zip_rename.rb:48:in `rename'
/Users/.../app/lib/zxp_rename.rb:48:in `block in renaming_zip'
...
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
Uncaught exception: undefined method `rename' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:49:in `block in renaming_zip'
    ...

要重命名条目,请对条目调用rename

第一次尝试失败,因为您正在
entry
上调用
get\u entry
,它应该在
ZipFile

第二次尝试失败,因为代码以双引号结束字符串

new_filename = entry.name.gsub('mimetype', '#mimetype-new')
第三次尝试失败,因为对象是
mimetype:Zip::ZipEntry
,而不是
Zip::ZipEntry

正确的方法是

new_filename = "#mimetype-new"

Zip::ZipFile.open(zip_file).each do |zipfile|
   files = zipfile.select(&:file?)
   files.each do |file|
      if entry.name == "mimetype"
        entry.rename(entry.name, new_filename)
      end
   end
end

要使用以下命令重命名zip中的文件: