我需要一种简单的方法来获取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
显示文件的大小不同,虽然它们非常接近(打开文件显示大部分内容完好无损).我正在制作一个小错误或完全不同(但可行)的方法来实现这一目标吗?
首先,您应该将文件作为二进制文件打开.然后,您可以在一个命令中读取整个文件.
file = File.open("path-to-file.tar.gz", "rb") contents = file.read
这将以字符串形式获取整个文件.
在那之后,你可能想要file.close
.如果不这样做,file
在垃圾收集之前不会关闭,因此在打开时会略微浪费系统资源.
如果你需要二进制模式,你需要以艰难的方式去做:
s = File.open(filename, 'rb') { |f| f.read }
如果没有,更短更甜是:
s = IO.read(filename)
为避免文件打开,最好将块传递给File.open.这样,文件将在块执行后关闭.
contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }
在os x上这些对我来说都是一样的......这可能是Windows中额外的"\ r"吗?
在任何情况下,你可能会更好:
contents = File.read("e.tgz") newFile = File.open("ee.tgz", "w") newFile.write(contents)
一些开/关安全怎么样?
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以获得更好的主意。