在Ruby中读取二进制文件作为string

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

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

我认为这足以将其转换为string,但是当我尝试将其写回像这样…

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

这不是同一个文件。 做ls -l显示文件大小不一,尽pipe它们非常接近(打开文件显示大部分内容完好无损)。 我正在做一个小错误还是一个完全不同(但可行)的方法来完成这个?

首先,你应该打开文件作为二进制文件。 然后你可以在一个命令中读取整个文件。

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

这将使你得到整个文件的string。

之后,你可能想file.close 。 如果不这样做, file在被垃圾收集之前不会被closures,所以在打开的时候系统资源会被轻微的浪费。

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

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

如果没有,更短更甜的是:

 s = IO.read(filename) 

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

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

在操作系统x这些对我来说是一样的…可能这可能是额外的“\ r”在Windows中?

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

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

怎么样一些开放/closures安全。

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

Ruby有二进制阅读

 data = IO.binread(path/filaname) 

或者如果低于Ruby 1.9.2

 data = IO.read(path/file) 

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

你做的是这样的:

 require 'base64' file_contents = Base64.encode64(tar_file_data) 

看看Base64 Rubydocs来获得更好的主意。

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

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

要么

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

在cmd中打印每个(文本)行。