使用Ruby以二进制文件的形式自动打开文件

使用Ruby以二进制文件的形式自动打开文件,ruby,file,encoding,binary,Ruby,File,Encoding,Binary,我正在使用Ruby 1.9打开几个文件,并将它们复制到存档中。现在有一些二进制文件,但有些不是。由于Ruby 1.9不会以二进制文件的形式自动打开二进制文件,有没有办法自动打开它们?(因此“.class”是二进制的,.txt不是)在类Unix平台上,以“二进制”和“文本”模式打开文件没有区别。在Windows上,“文本”模式将换行符转换为DOS样式,“二进制”模式不转换 除非在Windows平台上需要换行符转换,否则只需以“二进制”模式打开所有文件。在“二进制”模式下读取文本文件没有害处 如果您

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

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

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


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

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

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

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

由于Ruby 1.9.1有一个单独的方法用于二进制读取(),而1.9.3也有一个方法用于写入():

阅读:

content = IO.binread(file)
写作:

IO.binwrite(file, content)
由于
IO
File
的父类,因此您还可以执行以下可能更具表现力的操作:

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

请注意,这个答案是错误的。Ruby读入一个字符串,从1.9开始,该字符串有一个与之相关的编码。有关详细信息,请参阅更多高度修改的答案,忽略此问题。如果Alex可以删除它,那就更好了。如果我只是删除它,现有的答案就没有意义了(“AlexD的答案…”)。最好先将此答案中的信息(提到“b”标志对换行符转换的影响)与另一个答案中的信息合并。是的,因为
文件
类的父类是
IO
类。
content = File.binread(file)
File.binwrite(file, content)