Как закрыть ZipFile - PullRequest
       31

Как закрыть ZipFile

1 голос
/ 11 ноября 2009

Я передаю динамическое расположение zip-файла в def из базы данных. Я хочу разархивировать файл во временную папку, извлечь из него файл отчета xml, применить таблицу стилей xslt, скопировать ее как rhtml в каталог представления для рендеринга и удалить извлеченный файл временного XML. Функциональность работает нормально (файл rhtml перезаписывается каждый раз и обрабатывается), за исключением того, что он извлекается из одного и того же родительского zip-файла для каждого выполнения, а извлеченный XML-файл не может быть удален, что приводит меня к мысли, что первое выполнение не закрывает родительский файл почтовый индекс (выпуская свою ручку). Следовательно, последующие выполнения извлекают xml из первого выполненного почтового индекса. Я пробовал "Zip :: ZipFile.close", "zipFile = Zip :: ZipFile.open (fileLocation); zipFile.close", "File.close (fileLocation)" и другие перестановки. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 11 ноября 2009

Можете ли вы передать блок в 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
...