Как удалить непустую папку в zip-файле, используя Ruby gem 'zip' или 'rubyzip'? - PullRequest
0 голосов
/ 28 марта 2011

Я пытался удалить непустую папку в zip-файле. Я использую ruby ​​1.8.7 в Ubuntu 10.10. Я пробовал rubyzip драгоценный камень и zip драгоценный камень

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

Можно ли использовать метод FileUtils.rm_rf в файле fileutils в zip-файле?

Ответы [ 2 ]

1 голос
/ 28 марта 2011

Должно быть

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

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

0 голосов
/ 27 июня 2013

Я был немного ошеломлен, обнаружив, что rubyzip не сделал бы этого, будучи сбитым с толку тем фактом, что более многообещающий zipruby также вообще не имеет очевидного способа удаления файла.

При попытке реализовать мой собственный рекурсивудалить, кажется, что-то серьезно сломано в реализации rubyzip;внутри он хранит объект @entries, в котором другой код, наиболее очевидно Zip::ZipFileSystem::ZipFsDir, ожидает найти узлы типа :directory, но там их нет, поэтому он генерирует исключение не найден.Я попытаюсь опубликовать отчет об ошибке.

В любом случае следующий хак позволит вам удалить каталог из zip-файла, используя rubyzip.Обратите внимание, что при очистке каталога таким образом он исчезает, если вы просто хотите очистить его, вам может понадобиться использовать 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

для удаления каталога.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...