首页 > 解决方案 > Ruby File.exist?在文件可读之前返回 true

问题描述

我有一个 Rails 应用程序,我试图将大型 PDF 的创建传递给后台进程,并允许用户在完成后查看它。这是一个与 combine_pdf gem 结合并传递给delayed_job 的多页文档。

我有 3 个操作:第一个创建并保存文件,第二个通过异步请求以短延迟重复调用以检查文件是否存在,第三个在浏览器中显示 PDF。

我在使用第二部分时遇到了问题File.exist?('my_file.pdf'),但这是true在文件完成保存之前返回的。随后显示的用于查看 PDF 的链接会导致错误 (ActionController::MissingFile)。该文件实际上会在大约 10 秒后变为可用,此时链接可以正常工作。

我猜该文件在检查时仍在写入?如何检查文件保存是否已完成并且文件实际上可以读取?

标签: ruby-on-railsrubypdfdelayed-job

解决方案


您可以写入临时文件,然后在完成后重命名它。到目前为止,您还没有包含您的代码,但这样的事情可能对您有用:

def write_and_replace(path, file, file_name, data)
  file_path = File.join(folder_path, "#{file_name}.pdf")
  temp_file_path = File.join(folder_path, "temp_#{file_name}.pdf")

  File.open(temp_file_path, 'w') { |f| f.write(data) }

  # Args: existing file, new name
  File.rename(path, file_path)
  File.rename(temp_file_path, file)
  File.delete(file_path)
end

推荐阅读