【问题标题】:Working with tempfiles in Ruby在 Ruby 中使用临时文件
【发布时间】:2024-01-12 16:31:01
【问题描述】:

我想在用户的编辑器 ($EDITOR) 中打开一个临时文件,让用户在那里写入文本,然后在他关闭此文件后以某种方式使用其内容(例如注入另一个文件)。

在 Ruby 1.9.2 中实现此目的最合适的方法是什么?

【问题讨论】:

    标签: ruby file ruby-1.9.2 temporary-files


    【解决方案1】:

    我认为这里甚至不需要 Tempfile。您需要做的就是创建一个临时文件,例如在 /tmp 中,具有唯一的文件名,并将其传递给系统(使用正确的编辑器集。像这样:

    def editor_command
      ENV.fetch('EDITOR') { 'vi' }
    end
    
    temp_path = "/tmp/editor-#{ Process.pid }"
    
    system "#{ editor_command } #{ temp_path }"
    
    puts File.read(temp_path)
    

    Tempfile 的问题在于它假定对文件的控制权始终在您的应用程序中,但您需要在另一个操作系统进程中打开该文件。

    要创建文件名,您可以使用 ruby​​ 标准库的SecureRandomhttp://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom

    【讨论】:

      【解决方案2】:

      我不确定如何编写一些东西来可靠地检测文件何时关闭。您也许可以在循环中不断检查 File.mtime 之类的内容,以便判断修改时间是否已更改,但这不是一个好方法。

      我想知道你为什么要这样做。

      如果你想要用户输入,你能不能只使用gets 来代替?

      如果您想让输入数据的界面更令人愉悦,最好使用 Ruby Shoes 之类的东西。

      最后一个可能需要一点额外编程的选择是将 Ruby 作为原始 Web 服务器有效地运行(并通过 HTML 表单将数据发布到服务器)。为此,您可以使用 Mongrel (gem install mongrel) 之类的东西。

      【讨论】:

        【解决方案3】: