使用Ruby自动打开文件作为二进制文件
我正在使用Ruby 1.9打开几个文件并将它们复制到一个存档中。 现在有一些二进制文件,但有些不是。 由于Ruby 1.9不能自动打开二进制文件作为二进制文件,有没有办法自动打开它们? (所以“.class”是二进制的,“。txt”不是)
实际上,Alex D之前的回答是不完整的。 虽然在Unix文件系统中确实没有“文本”模式,但Ruby确实在二进制和非二进制模式下打开文件有所不同:
s = File.open('/tmp/test.jpg', 'r') { |io| io.read } s.encoding => #
不同于(注意"rb"
)
s = File.open('/tmp/test.jpg', 'rb') { |io| io.read } s.encoding => #
正如文档所说,后者将外部编码设置为ASCII-8BIT,这告诉Ruby不要尝试解释UTF-8的结果。 您可以通过使用s.force_encoding('ASCII-8BIT')
显式设置编码来实现相同的function。 如果您想将二进制文件读入字符串并移动它们(例如将它们保存到数据库等),这是关键。
从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)
在类Unix的平台上,在“二进制”和“文本”模式下打开文件没有区别。 在Windows上,“文本”模式将换行符转换为DOS样式,而“二进制”模式则不然。
除非您在Windows平台上需要换行转换,否则只需以“二进制”模式打开所有文件即可。 在“二进制”模式下读取文本文件没有任何害处。
如果您真的想要区分,则必须将File.extname(filename)与已知扩展名列表(如“.txt”和“.class”)进行匹配。