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)”和其他排列。

4

1 回答 1

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

== 编辑 ==

根据您的评论,这是一个工作示例:

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
于 2009-11-11T19:57:07.977 回答