[英]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
:
data = File.read(name, {:encoding => 'BINARY'})
data = File.read(name, encoding: 'BINARY')
(請注意,在這兩種情況下, '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.