2012-02-29 41 views
1

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

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

从下面的图片很显然,这不是一个确切的文件副本,当我尝试在它的报告,该文件是一个图像查看器打开新创建的文件腐败。我试图以不同的方式复制文件,如clone.write(tempfile.read)等,但没有成功。

File compare *文件查看器还指出原始为ANSI Dos/Windows,克隆为ANSI Macintosh。文件大小也相差约200字节。

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

请帮忙!

问候,
皮埃尔

回答

3

这将是更有益的,看看这些文件的十六进制视图,而不是一个文本编辑器的旅游解说。我的猜测是,至少有一个文件不是以二进制模式打开的。在Ruby 1.9中,尝试使用

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

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

+0

谢谢,我的最终解决方案是我不创建另一个临时文件,我只是在binmode中传递一个file.open。 – 2012-02-29 15:43:29