我需要一种简单的方法来获取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
会显示文件大小不同,但它们非常接近(打开文件会显示大部分内容完整)。我正在制作一个小错误,或者完全不同(但可行)的方法来实现这个目标吗?
答案 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
:
data = File.read(name, {:encoding => 'BINARY'})
data = File.read(name, encoding: 'BINARY')
(请注意,在这两种情况下,'BINARY'
都是 'ASCII-8BIT'
的 alias。)