题
我需要一种简单的方法来获取 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 中额外的“ ”吗?
无论如何,你可能会更好:
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 Ruby文档 以获得更好的想法。
如果您可以通过 Base64 对 tar 文件进行编码(并将其存储在纯文本文件中),您可以使用
File.open("my_tar.txt").each {|line| puts line}
或者
File.new("name_file.txt", "r").each {|line| puts line}
打印 cmd 中的每一(文本)行。
不隶属于 StackOverflow