0

我正在使用 sinatra、ruby 和 MongoDB 从 MongoDB 导出 CSV 文件。我能够创建 CSV 文件并将其导出。我导出后删除文件。但只有在我退出 sinatra 后它才会被删除。谁能解释这是为什么?假设abc****.csv创建了一个文件。我正在使用删除此文件

file_path = '/home/Test_app';
file = Tempfile.new([@@uname,'.csv'],file_path);
file_name = file.path();   
puts file_name  # gives /home/Test_app/xyz****.csv
send_file(file_name, :disposition => 'attachment', :filename =>File.basename(file_name));
File.delete(file_name); 
File.unlink(file_name);

但是只有在我退出 sinatra 服务器后它才会被删除。谁能解释一下?

4

2 回答 2

1

您从不调用file.close,这意味着文件将保持打开状态,因此在您的应用程序退出之前不会被删除。

尝试遵循Tempfile 文档中给出的建议:

file = Tempfile.new('foo')
begin
  ...do something with file...
ensure
  file.close
  file.unlink   # deletes the temp file
end

这将确保文件正确关闭和删除,即使在 和 之间的代码中引发异常也是begin如此ensure

于 2012-06-18T21:01:16.220 回答
0

也许这是一个大文件;由于 HTTP 连接在流式传输完成之前不会关闭,因此之后的代码send_file不会被执行。这可能是一个正当的理由。您是否检查过整个文件是否正在下载到客户端?如果不是这种情况,请尝试使用较小的文件。我假设您已经实现(但没有在此处编写)将数据写入file_namefrom MongoDB 的代码。

于 2012-06-20T15:26:46.163 回答