在Ruby中以字符串形式读取二进制文件

时间:2020-03-06 14:41:57  来源:igfitidea点击:

我需要一种简单的方法来获取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可以显示文件大小不同,尽管它们非常接近(打开文件可以看到大部分内容完整无缺)。我正在犯一个小错误,还是一种完全不同(但可行)的方式来实现这一目标?

解决方案

我们可能可以在Base64中编码tar文件。 Base 64将为我们提供文件的纯ASCII表示形式,我们可以将其存储在纯文本文件中。然后,我们可以通过解码回文本来检索tar文件。

我们可以执行以下操作:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

看一下Base64 Rubydocs以获得更好的主意。

在OS X上,这些对我来说都是一样的...在Windows中这可能是多余的" \ 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 }