Чтение двоичного файла как строки в 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 }
в os x для меня это одно и то же...может ли это быть дополнительным "\ r" в 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)
Вероятно, вы можете закодировать файл tar в Base64.База 64 предоставит вам чистое ASCII-представление файла, которое вы можете сохранить в виде обычного текстового файла.Затем вы можете извлечь tar-файл, расшифровав текст обратно.
Вы делаете что-то вроде:
require 'base64'
file_contents = Base64.encode64(tar_file_data)
Взгляните на Base64 Rubydocs ( Рубидоки ) чтобы получить представление получше.
Если вы можете закодировать файл tar с помощью Base64 (и сохранить его в виде обычного текстового файла), вы можете использовать
File.open("my_tar.txt").each {|line| puts line}
или
File.new("name_file.txt", "r").each {|line| puts line}
для печати каждой (текстовой) строки в cmd.