使用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) 

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

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

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

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

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