Мне нужен простой способ взять файл 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
показывает, что файлы имеют разные размеры, хотя они довольно близки (и открытие файла показывает большую часть содержимого без изменений). Есть ли небольшая ошибка, которую я делаю, или совершенно другой (но выполнимый) способ сделать это?
IO.read
как в противном случае предпочтительным будет ответ.Ответы:
Во-первых, вы должны открыть файл в виде двоичного файла. Затем вы можете прочитать весь файл, в одной команде.
Это даст вам весь файл в строке.
После этого вы, вероятно, захотите
file.close
. Если вы этого не сделаете,file
его не закроют до тех пор, пока он не будет собран сборщиком мусора, поэтому при открытой работе это будет небольшой тратой системных ресурсов.источник
contents = (contents of file "path to file.txt" as string)
.begin {..open..} ensure {..close..} end
блокахcontents = File.binread('path-to-file.tar.gz')
Смотрите апидок .File
подклассIO
.Если вам нужен двоичный режим, вам нужно сделать это сложным путем:
Если нет, то короче и слаще
источник
s = File.open(filename, 'rb', &:read)
Чтобы не оставлять файл открытым, лучше всего передать блок в File.open. Таким образом, файл будет закрыт после выполнения блока.
источник
на OS X это то же самое для меня ... это может быть дополнительный "\ R" в Windows?
в любом случае вам может быть лучше с:
источник
как насчет безопасности открытия / закрытия.
источник
Рубин имеет бинарное чтение
или если меньше, чем Ruby 1.9.2
источник
Вы, вероятно, можете кодировать файл tar в Base64. Base 64 даст вам чистое ASCII-представление файла, который вы можете сохранить в виде простого текстового файла. Затем вы можете получить файл tar, расшифровав текст обратно.
Вы делаете что-то вроде:
Взгляните на Base64 Rubydocs, чтобы получить лучшее представление.
источник
Если вы можете закодировать файл tar с помощью Base64 (и сохранить его в виде простого текстового файла), вы можете использовать
или
распечатать каждую (текстовую) строку в cmd.
источник