簡體   English   中英

在Ruby中將二進制文件作為字符串讀取

[英]Read binary file as string in Ruby

我需要一種簡單的方法來獲取 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 }

一些開/關安全怎么樣。

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

在 os x 上這些對我來說是一樣的......這可能是 Windows 中額外的“\\r”嗎?

在任何情況下,你可能會更好:

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

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以獲得更好的主意。

Ruby 1.9+ 具有IO.binread (請參閱@bardzo 的回答)並且還支持將編碼作為選項傳遞給IO.read

(請注意,在這兩種情況下, 'BINARY'都是'ASCII-8BIT'別名。)

如果您可以通過 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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM