0

MongoDB から CSV ファイルをエクスポートするために、sinatra、ruby、および MongoDB を使用しています。CSV ファイルを作成してエクスポートできます。エクスポート後にファイルを削除します。しかし、シナトラを終了した後にのみ削除されます。これがなぜなのか説明できる人はいますか?ファイル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 documentationに記載されている提案に従ってみてください:

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_nameMongoDB からデータを書き込むためのコードを実装している (ただし、ここには記述していません) と想定しています。

于 2012-06-20T15:26:46.163 に答える