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

时间:2008-09-25 01:18:26

标签: ruby string file-io

我需要一种简单的方法来获取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会显示文件大小不同,但它们非常接近(打开文件会显示大部分内容完整)。我正在制作一个小错误,或者完全不同(但可行)的方法来实现这个目标吗?

9 个答案:

答案 0 :(得分:393)

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

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

这将以字符串形式获取整个文件。

之后,您可能想要file.close。如果你不这样做,file在被垃圾收集之前不会被关闭,因此在打开时会略微浪费系统资源。

答案 1 :(得分:240)

如果你需要二进制模式,你需要这么做:

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

如果没有,更短更甜:

s = IO.read(filename)

答案 2 :(得分:112)

为避免文件处于打开状态,最好将块传递给File.open。这样,文件将在块执行后关闭。

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

答案 3 :(得分:17)

在os x上这些对我来说都是一样的......这可能是Windows中的额外“\ r”吗?

无论如何,你可能会更好:

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

答案 4 :(得分:16)

一些开/关安全怎么样。

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

答案 5 :(得分:8)

Ruby有二进制读取

data = IO.binread(path/filaname)

或者如果小于Ruby 1.9.2

data = IO.read(path/file)

答案 6 :(得分:5)

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

你做的事情如下:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

请查看Base64 Rubydocs以获得更好的主意。

答案 7 :(得分:0)

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

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

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

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

答案 8 :(得分:0)

Ruby 1.9+ 具有 IO.binread(参见 @bardzo's answer)并且还支持将编码作为选项传递给 IO.read

  • Ruby 1.9

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

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

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