Вопрос

Мне нужен простой способ взять 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top