使用Ruby自动打开文件作为二进制文件

时间:2012-01-19 16:27:25

标签: ruby file encoding binary

我正在使用Ruby 1.9打开几个文件并将它们复制到一个存档中。现在有一些二进制文件,但有些文件不是。由于Ruby 1.9不能自动打开二进制文件作为二进制文件,有没有办法自动打开它们? (所以“.class”是二进制的,“。txt”不是)

3 个答案:

答案 0 :(得分:32)

实际上,Alex D之前的回答是不完整的。虽然在Unix文件系统中确实没有“文本”模式,但Ruby确实在以二进制和非二进制模式打开文件之间有所区别:

s = File.open('/tmp/test.jpg', 'r') { |io| io.read }
s.encoding
=> #<Encoding:UTF-8>

与(注意"rb"

不同
s = File.open('/tmp/test.jpg', 'rb') { |io| io.read }
s.encoding
=> #<Encoding:ASCII-8BIT>

后者,正如docs所说,将外部编码设置为ASCII-8BIT,告诉Ruby不要尝试以UTF-8解释结果。您可以通过使用s.force_encoding('ASCII-8BIT')显式设置编码来实现相同的功能。如果您想将二进制文件读入字符串并移动它们(例如将它们保存到数据库等),这是关键。

答案 1 :(得分:12)

从Ruby 1.9.1开始,有一个单独的二进制读取方法(IO.binread),从1.9.3开始,还有一个用于写入(IO.binwrite)的方法:

阅读:

content = IO.binread(file)

写作:

IO.binwrite(file, content)

由于IOFile的父类,您还可以执行以下操作,这可能更具表现力:

content = File.binread(file)
File.binwrite(file, content)

答案 2 :(得分:3)

在类Unix平台上,在“二进制”和“文本”模式下打开文件没有区别。在Windows上,“文本”模式将换行符转换为DOS样式,而“二进制”模式则不会。

除非您需要在Windows平台上进行换行转换,否则只需以“二进制”模式打开所有文件即可。在“二进制”模式下读取文本文件没有任何害处。

如果您真的想要区分,则必须将File.extname(filename)与已知扩展名列表匹配,例如“.txt”和“.class”。