我正在使用Ruby 1.9打开多个文件并将它们复制到档案中。现在有一些二进制文件,但有些不是。由于Ruby 1.9不会自动将非二进制文件作为二进制文件打开,是否有一种方法可以自动打开它们? (例如“.class”是二进制文件,“.txt”则不是)
实际上,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>
根据文档所述,后一种方式会将外部编码设置为ASCII-8BIT,这告诉Ruby不要尝试以UTF-8解释结果。您可以通过显式地设置编码s.force_encoding('ASCII-8BIT')
来实现相同的效果。如果您想将二进制读入字符串并移动它们(例如保存到数据库等),这非常重要。
IO.binread
),自 1.9.3 起也有了一个用于写入的方法(IO.binwrite
)。content = IO.binread(file)
写作技巧:
IO.binwrite(file, content)
由于 IO
是 File
的父类,你也可以使用下面这种方式,它可能更加表达清晰:
由于 IO
是 File
的父类,你也可以采用以下方式,这可能更加表达清晰:
content = File.binread(file)
File.binwrite(file, content)
File
类的父类是IO
类。 - KARASZI István