在Ruby中读取二进制文件为字符串

我需要一个简单的方法来获取tar文件并将其转换为字符串(反之亦然)。在Ruby中有办法做到这一点吗?我最好的尝试是这样的:

file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
contents << line
}

我认为这足以将其转换为字符串,但当我试图像这样将它写回来时……

newFile = File.open("test.tar.gz", "w")
newFile.write(contents)

这不是同一个文件。执行ls -l显示文件大小不同,尽管它们非常接近(打开文件会显示大部分内容完好无损)。是我犯了一个小错误,还是有完全不同的(但可行的)方法来实现这个目标?

220569 次浏览

你可以用Base64来编码tar文件。基数64将为您提供可以存储在纯文本文件中的文件的纯ASCII表示形式。然后可以通过解码文本来检索tar文件。

你可以这样做:

require 'base64'


file_contents = Base64.encode64(tar_file_data)

查看Base64 Rubydocs以获得更好的理解。

在OS x上,这些对我来说是一样的…这个“\r”可以在窗口中多写一个吗?

在任何情况下,你可能会更好:

contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)

首先,您应该以二进制文件的形式打开该文件。然后,您可以在一个命令中读取整个文件。

file = File.open("path-to-file.tar.gz", "rb")
contents = file.read

这将为您提供一个字符串形式的整个文件。

在那之后,你可能想file.close。如果你不这样做,file将不会关闭,直到它被垃圾回收,所以当它打开时,它将是一个轻微的系统资源浪费。

为了避免打开文件,最好将一个块传递给file .open。这样,该文件将在块执行后关闭。

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }

如果你需要二进制模式,你需要做的艰难的方式:

s = File.open(filename, 'rb') { |f| f.read }

如果不是,那么更短更甜的是:

s = IO.read(filename)

开/关保险柜怎么样?

string = File.open('file.txt', 'rb') { |file| file.read }

如果您可以使用Base64对tar文件进行编码(并将其存储在纯文本文件中),则可以使用

File.open("my_tar.txt").each {|line| puts line}

File.new("name_file.txt", "r").each {|line| puts line}

打印cmd中的每一行(文本)。

Ruby有二进制读取

data = IO.binread(path/filaname)

或者低于Ruby 1.9.2

data = IO.read(path/file)

Ruby 1.9+有IO.binread(参见@bardzo的回答),也支持将编码作为选项传递给IO.read:

  • < p > Ruby 1.9

    data = File.read(name, {:encoding => 'BINARY'})
    
  • < p > Ruby 2 +

    data = File.read(name, encoding: 'BINARY')
    

(注意在这两种情况下,'BINARY'都是'ASCII-8BIT'别名。)