Можете ли вы передать блок в Zip :: ZipFile.open? Это закроет его, когда выйдет блок:
Zip::ZipFile.open(file_name) do |zip_file|
zip_file.extract('report.xml', '/tmp')
end
# zip file is closed at this point
# apply_xslt
# copy rhtml to app/views/...
# etc
== РЕДАКТИРОВАТЬ ==
Основываясь на ваших комментариях, вот рабочий пример:
require 'rubygems'
require 'zip/zip'
require 'fileutils'
zip_file_name = 'test.zip'
out_dir = 'tmp_for_zip'
FileUtils.mkdir_p out_dir
Zip::ZipFile.open(zip_file_name) do |zip_file|
report_name = File.basename(zip_file.name).gsub('zip', 'xml')
out = File.join(out_dir, report_name)
zip_file.extract(report_name, out) unless File.exists?(out)
puts "extracted #{report_name} to #{out}"
end
Кроме того, я не знаю, работает ли у вас Unix, но вы можете использовать lsof (список открытых файлов), чтобы узнать, действительно ли файл открыт:
lsof | grep your_file_name