Я был немного ошеломлен, обнаружив, что 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
для удаления каталога.