我正在使用Ruby 1.9打开几个文件并将它们复制到一个存档中。现在有一些二进制文件,但有些文件不是。由于Ruby 1.9不能自动打开二进制文件作为二进制文件,有没有办法自动打开它们? (所以“.class”是二进制的,“。txt”不是)
答案 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)
由于IO
是File
的父类,您还可以执行以下操作,这可能更具表现力:
content = File.binread(file)
File.binwrite(file, content)
答案 2 :(得分:3)
在类Unix平台上,在“二进制”和“文本”模式下打开文件没有区别。在Windows上,“文本”模式将换行符转换为DOS样式,而“二进制”模式则不会。
除非您需要在Windows平台上进行换行转换,否则只需以“二进制”模式打开所有文件即可。在“二进制”模式下读取文本文件没有任何害处。
如果您真的想要区分,则必须将File.extname(filename)与已知扩展名列表匹配,例如“.txt”和“.class”。