2011-03-28 21 views
0

私はzipファイル内の空でないフォルダを削除しようとしました。 私はUbuntu 10.10でruby 1.8.7を使用しています。私はそれが次のエラーRuby gem 'zip'または 'rubyzip'を使用してzipファイル内の空でないフォルダを削除する方法はありますか?

エラー番号を報告しrubyzip宝石とzip宝石

require 'zip/zipfilesystem' 
Zip::ZipFile.open('apkfile.apk') { |zfile| zfile.dir.delete('META-INF') } 

を試してみました:: ENOENT:そのようなファイルやディレクトリは

ない今、私は唯一のディレクトリ内のすべてのエントリを削除することができディレクトリは最後に削除されたディレクトリのファイルの後に削除されます。

require 'zip/zipfilesystem' 
Zip::ZipFile.open('apkfile.apk') do |zfile| 
    zfile.file.delete("META-INF/foo1.bar") 
    zfile.file.delete("META-INF/foo2.bar") 
    zfile.file.delete("META-INF/foo3.bar") 
end 

それはzipファイルでのfileutilsの宝石でFileUtils.rm_rf方法を使用することは可能ですか?

答えて

1

Zip::ZipFile.open('foo.zip') { |zfile| zfile.remove('bar') } 

http://rubyzip.sourceforge.net/classes/Zip/ZipFile.html#M000150

+0

お返事ありがとうございます。私もこれを試しました。同じエラーが表示されます。 – Xiao

+0

奇妙な、それは私のために働く。愚かな疑問を言い訳にしますが、ジッパーの中に 'bar'という名前のディレクトリがあるのでしょうか? –

+0

私は質問を更新しました。より明確になることを願って – Xiao

0

にする必要があり、私はより多くの有望なziprubyものファイルを削除する明白な方法を持っていないという事実によって混乱、rubyzipがこれをしないだろうということを見つけるために少しびっくりしましたすべて。

私自身の再帰的な削除を実装しようとすると、rubyzipの実装に深刻な問題があるようです。内部的には、他のコード、最も明らかにZip::ZipFileSystem::ZipFsDir:directory型ノードを見つけると予想される@entriesオブジェクトを格納しますが、見つからない例外がスローされます。私はバグレポートを投稿しようとするつもりです。

とにかく、以下のハッキングでは、rubyzipを使ってzipファイルからディレクトリを削除することができます。この方法でディレクトリを空にすることで消えてしまいます。空にしたい場合は、ZipFsDirmkdirを追加する必要があります。

class Zip::ZipFile 
    def rm_rf(dir) 
    dir_entries = self.entries.select { |e| Regexp.new("^#{File.join(dir, '/')}.*") === e.name } 
    dir_entries.each { |e| self.remove(e) } 
    dir_entries 
    end 
end 

は、次に使用:

Zip::ZipFile.open(path) do |a| 
    a.rm_rf('directory-name') 
end 

はディレクトリを削除します。

関連する問題