문제

타르 파일을 가져 와서 문자열로 변환하는 쉬운 방법이 필요합니다 (그 반대로). 루비에서 이것을 할 수있는 방법이 있습니까? 나의 최선의 시도는 이것이었습니다.

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)

파일을 열어 두지 않으려면 블록을 파일로 전달하는 것이 가장 좋습니다. 이렇게하면 블록이 실행 된 후 파일이 닫힙니다.

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)

또는 루비보다 작은 경우 1.9.2

data = IO.read(path/file)

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

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

require 'base64'

file_contents = Base64.encode64(tar_file_data)

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

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 ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top