如何使用Ruby gem'zip'或'rubyzip'删除zip文件中的非空文件夹?

时间:2011-03-28 06:00:24

标签: ruby zip

我尝试删除zip文件中的非空文件夹。 我在Ubuntu 10.10中使用ruby 1.8.7。我尝试了rubyzip gem和zip gem

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

报告了以下错误

  

Errno :: 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 gem中使用FileUtils.rm_rf方法?

2 个答案:

答案 0 :(得分:1)

应该是

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

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

答案 1 :(得分:0)

我发现rubyzip不会这样做有点让我感到震惊,因为更有希望的zipruby根本没有明显的方法可以删除文件。

在尝试实现我自己的递归删除时,似乎在rubyzip的实现中存在严重破坏;在内部它存储一个@entries对象,其中其他代码(最明显是Zip::ZipFileSystem::ZipFsDir)期望找到:directory类型节点,但是没有,所以它会抛出未找到的异常。我会尽力发布错误报告。

无论如何,以下hack将允许您使用rubyzip从zip文件中删除目录。请注意,通过以这种方式清空目录它会消失,如果您只想清空它,则可能需要使用ZipFsDir mkdir将其添加回来。

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

删除目录。