2012-01-17 29 views
1

zipのファイルとディレクトリの名前を変更しようとしています。私は3つの異なったものを試してみました。それを行う正しいコマンドは何ですか?あなたは、ファイルがzipファイルに存在して見ることができるように、ruby​​zipを使用して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 

私は任意の名前変更トライアルコマンドなしで実行した場合は、私はこの出力を得る:

以下は私のコードの抜粋です。これは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' 
... 

第二の試行(アンコメント)に、私はこのエラーを取得する:

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

答えて

0

名前を変更するにはエントリのエントリの名前の変更。

第一試みあなたはentryget_entryを呼び出しているので、それはZipFileにする必要があります失敗します。

2回目の試みは、二重引用符で文字列を終了するため、失敗します。

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

第三試みは、オブジェクトがmimetype:Zip::ZipEntryで、正しい方法ではないZip::ZipEntry

あるので、それはrubyzipでのzip内のファイルの名前を変更するには

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 
0

で失敗します。

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 
関連する問題