Я передаю местоположение динамического zip-файла в def из базы данных. Я хочу разархивировать файл во временное местоположение, извлечь файл отчета xml внутри, применить таблицу стилей xslt, скопировать ее как rhtml в каталог представления для рендеринга и удалить извлеченный temp файл xml. Функциональность работает нормально (файл rhtml перезаписывается каждый раз и визуализуется), за исключением того, что он извлекает из одного и того же родительского почтового индекса для каждого выполнения, и извлеченный XML не может быть удален, что заставляет меня думать, что первое выполнение не закрывает родительский zip (освобождение его ручки). Следовательно, последующие исполнения извлекают xml из первого выполненного zip. Я пробовал «Zip :: ZipFile.close», «zipFile = Zip :: ZipFile.open (fileLocation); zipFile.close», «File.close (fileLocation)» и другие перестановки. Любая помощь будет оценена по достоинству.Как закрыть ZipFile
1
A
ответ
0
Можете ли вы передать блок 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
== EDIT ==
на основе ваших комментариев, вот рабочий пример:
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
Смежные вопросы
- 1. ZipFile внутри zipFile
- 2. Настройка пути X в «ZipFile zipfile = new ZipFile (« X »);
- 3. Извлечь zipFile из zipFile в память
- 4. Извлечь ZipFile
- 5. Как сделать zipfile защищенным паролем
- 6. Структура каталога Zipfile управления
- 7. Переименование ZipFile в Python
- 8. Java: ZipFile using Path
- 9. Python и ZipFile модуль
- 10. Zipfile Метод не работает
- 11. python zipfile несколько файлов
- 12. Сжатие папки в ZipFile
- 13. Создание zipFile выхлопов памяти
- 14. ZipFile извлекая вопрос
- 15. VBS, назвав zipfile?
- 16. Mocking zipfile in python
- 17. VB.Net 4.6 using Zipfile
- 18. Java ByteBuffer для Zipfile
- 19. java.util.zip - ZipInputStream v.s. ZipFile
- 20. Поток пуст от ZipFile
- 21. Android: чтение zipfile - EOFException
- 22. ZipArchive ZipFile не сжимает
- 23. Как загрузить ZipFile с FTP-сервера
- 24. Как установить ZipFile с помощью DotNetZip?
- 25. Как добавить кучу изображений в zipfile
- 26. Как создать rar/zipfile и загрузить
- 27. Как загрузить ZipFile из веб-сервера dotnet?
- 28. Как настроить веб-контроллер api для ZipFile
- 29. Как получить путь к файлу объекта ZipFile?
- 30. Python zipfile, Как установить уровень сжатия?
Я не знаю названия o f 'report.xml'. Я делал это динамически с помощью цикла: Zip :: ZipFile.open (file.to_s) {| zip_file | zip_file.each {| f | @Base = File.basename (f.name) @f_path = File.join (TEMPDIR, @ основание) \t \t \t FileUtils.mkdir_p (File.dirname (@f_path)) zip_file.extract (е, @f_path) если File.exist? (@ f_path) zip_file.close } \t \t \t } название 'report.xml' имеет такое же имя, как корень почтового индекса ("blah_report.xml" в «blah_report. zip "), поэтому я предполагаю, что могу разобрать его, но это похоже на боль (и не слишком эффективный - или элегантный) –
Есть ли способ сделать« zip_file.extract (во-первых, '/ tmp') "? На zip будет только 1 отчет. –
К сожалению, ваш код дает тот же результат, что и мой оригинал. У меня все еще есть 2 проблемы. Как только xml извлекается, я использую его для создания объекта XML Document, применяю таблицу стилей XSLT и копирую результат в «views /.../ sampleReport.rhtml» для рендеринга. Исходный xml не может быть удален (через код или вручную), пока сервер не будет отключен, чтобы выпустить файл. (Возможно ли, что объект Doc все еще держится за него, а не от zip-родителя). Кроме того, рендеринг нового rhtml всегда показывает результат первого выполнения, даже если я проверил, что rhtml изменился. Может ли это быть проблемой кэширования? –