我需要一种简单的方法来获取 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 中的每一(文本)行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top