当前位置:  开发笔记 > 后端 > 正文

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

如何解决《在Ruby中将二进制文件读为字符串》经验,为你挑选了7个好方法。

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



1> David Nehme..:

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

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

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

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


One-liner:File.open("path-to-file.tar.gz","rb").阅读
二进制标志仅与Windows相关,这使文件描述符保持打开状态.File.read(...)更好.
@ArianFaurtosh不,这是另一种读取文件的方法 - 这并不意味着它将被视为可执行的并且可以运行!对于简单的"阅读"方法而言,这将是一个可怕的副作用.
这应该在`begin {..open ..}确保{..close ..} end`块中完成

2> 小智..:

如果你需要二进制模式,你需要以艰难的方式去做:

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

如果没有,更短更甜是:

s = IO.read(filename)



3> Aaron Hinni..:

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

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


这是一个比David Nehme更好的答案,因为文件描述符是一个有限的系统资源,耗尽它们是一个很容易避免的常见问题.

4> Purfideas..:

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

在任何情况下,你可能会更好:

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



5> Alex..:

一些开/关安全怎么样?

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


这与2008年发布的[Aaron Hinni的回答](http://stackoverflow.com/a/131096/215168)相同(除了不使用OP的文件和变量名称)...
File.open(){| file | 块}在块终止时自动关闭.http://ruby-doc.org/core-1.9.3/File.html#method-c-open

6> 小智..:

Ruby有二进制读取

data = IO.binread(path/filaname)

或者如果小于Ruby 1.9.2

data = IO.read(path/file)



7> 小智..:

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

您可以执行以下操作:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

看一下Base64 Rubydocs以获得更好的主意。

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有