我正在将一个动态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)“和其他排列。任何帮助都将不胜感激。
发布于 2009-11-12 03:57:08
你能把一个块传递给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_namehttps://stackoverflow.com/questions/1717268
复制相似问题