[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에서 이것들은 나에게 동일합니다 … 이것은 Windows에서 여분의 “\ r”일 수 있습니까?

어쨌든 당신은 다음과 같이 더 나을 수 있습니다.

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


답변

어떤 개방 / 폐쇄 안전은 어떻습니까?

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


답변

루비는 이진 읽기

data = IO.binread(path/filaname)

또는 Ruby 1.9.2보다 작은 경우

data = IO.read(path/file)


답변

tar 파일을 Base64로 인코딩 할 수 있습니다. Base 64는 일반 텍스트 파일로 저장할 수있는 파일의 순수한 ASCII 표현을 제공합니다. 그런 다음 텍스트를 다시 디코딩하여 tar 파일을 검색 할 수 있습니다.

당신은 다음과 같은 일을합니다 :

require 'base64'

file_contents = Base64.encode64(tar_file_data)

더 나은 아이디어를 얻으려면 Base64 Rubydocs 를 살펴보십시오 .