動的 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)」、およびその他の順列を試しました。
1321 次
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 に答える