1

zip 内のファイルとディレクトリの名前を変更しようとしています。私は3つの異なるものを試しましたが、すべてうまくいきませんでした。それを行うための正しいコマンドは何ですか?

以下は私のコードの抜粋です:

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

最初の試行 (コメントなし) で、次のエラーが発生します。

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

2回目の試行(コメントなし)で、次のエラーが発生します:

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

2 に答える 2

0

エントリの名前を変更するには、エントリで rename を呼び出します。

を呼び出しているため、最初の試行は失敗します。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
于 2013-03-29T18:45:28.817 に答える