首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何关闭ZipFile

如何关闭ZipFile
EN

Stack Overflow用户
提问于 2009-11-12 02:44:28
回答 1查看 1.3K关注 0票数 1

我正在将一个动态zip文件位置从数据库传递给一个def。我希望将文件解压缩到一个临时位置,在其中提取xml报告文件,应用xslt样式表,将其作为rhtml复制到视图目录以进行呈现,然后删除临时提取的xml文件。功能运行良好( rhtml文件每次都会被覆盖并呈现),只是每次执行都从相同的父zip中提取,并且提取的xml不能被删除,这让我相信第一次执行并没有关闭父zip (释放其句柄)。因此,后续执行将从执行的第一个zip中提取xml。我尝试过"Zip::ZipFile.close“、"zipFile = Zip::ZipFile.open(fileLocation);zipFile.close”、"File.close(fileLocation)“和其他排列。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2009-11-12 03:57:08

你能把一个块传递给Zip::ZipFile.open吗?这将在块退出时将其关闭:

代码语言:javascript
复制
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

==编辑==

根据您的评论,下面是一个有效的示例:

代码语言:javascript
复制
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 (列出打开的文件)来查看文件是否真正打开:

代码语言:javascript
复制
lsof | grep your_file_name
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1717268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档