【问题标题】:Ruby file copy produces different fileRuby文件复制产生不同的文件
【发布时间】:2012-02-29 15:02:28
【问题描述】:

我对 ruby​​ 中的文件处理不是很熟悉。我遇到的一个问题是读取和写入二进制文件不会产生完全相同的文件。

clone = Tempfile.new(tempfile.original_filename)
FileUtils.copy_stream(tempfile, clone)
clone.flush

从下图中可以清楚地看出它不是一个精确的文件副本,当我尝试在图像查看器中打开新创建的文件时,它报告该文件已损坏。我试过用clone.write(tempfile.read)等不同的方式复制文件,但没有成功。

*文件查看器还显示原始文件是 ANSI Dos/Windows,克隆文件是 ANSI Macintosh。文件大小也相差约 200 字节。

我想要完成的实际上只是简单地使用 Tempfile 两次。文件通过 rails 上传并作为 Tempfile 提供给我。我想将它提交给两个不同的 restful 服务,RestClient.post 会自动关闭文件。另一种选择是向 RestClient 提交某种内存流克隆,以便它无法关闭我的文件。如果我将File.open(tempfile.path) 提交给 RestClient,它会产生相同的损坏文件,这表明问题是读取而不是写入。如果我将原始 Tempfile 对象提交给 RestClient,它可以正常工作,但随后它被关闭并删除,我无法再次发送。

请帮忙!

问候,
皮埃尔

【问题讨论】:

    标签: ruby-on-rails ruby file rest temporary-files


    【解决方案1】:

    查看这些文件的十六进制视图而不是文本编辑器的解释会更有帮助。我的猜测是至少有一个文件没有以二进制模式打开。在 Ruby 1.9 中,尝试

    open(filename, 'rb')
    open(filename, 'wb')
    Tempfile.new(filename, :binmode => true)
    

    分别用于打开文件进行读/写和创建二进制临时文件。

    【讨论】:

    • 谢谢,我的最终解决方案是我不创建另一个临时文件,我只是在 binmode 中传递一个 file.open。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多