在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 }