Как переименовать файл и каталог в zip-файле, используя rubyzip - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь переименовать файл и каталог в 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-файле. Это просто не класс File, а класс Zip :: ZipEntry, и я могу разобрать новое имя.

mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new

с 1-й попытки (без комментариев) я получаю эту ошибку:

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

с 3-й попытки (без комментариев) я получаю эту ошибку:

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'
    ...

Ответы [ 2 ]

0 голосов
/ 27 сентября 2015

Чтобы переименовать файл внутри zip с помощью rubyzip :

require 'zip'

old_name = 'mimetype'
new_filename = '#mimetype-new'

Zip::ZipFile.open(zip_file_path).each do |zipfile|
  files = zipfile.select(&:file?)
  file = files.find{|f| f.name == old_name}
  zipfile.rename(file.name, new_filename) if file
end
0 голосов
/ 29 марта 2013

Чтобы переименовать запись, переименуйте запись в записи.

1-я попытка не удалась, потому что вы звоните get_entry на entry, она должна быть на ZipFile.

2-я попытка завершается неудачно, потому что код заканчивает строку двойными кавычками.

new_filename = entry.name.gsub('mimetype', '#mimetype-new')

3-я попытка завершается неудачей, потому что объект 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
...