Pergunta

Eu preciso de uma maneira fácil de tomar um arquivo tar e convertê-lo em um string (e vice-versa). Existe uma maneira de fazer isso em Ruby? Minha melhor tentativa foi o seguinte:

file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
  contents << line
}

Eu pensei que seria suficiente para convertê-lo para uma cadeia, mas quando eu tento escrever-lo de volta como este ...

newFile = File.open("test.tar.gz", "w")
newFile.write(contents)

Não é o mesmo arquivo. Fazendo shows ls -l os arquivos são de tamanhos diferentes, embora sejam muito perto (e abrir o arquivo revela a maioria do conteúdo intacto). Existe um pequeno erro que eu estou fazendo ou uma forma totalmente diferente (mas exequível) para alcançar este objetivo?

Foi útil?

Solução

Primeiro, você deve abrir o arquivo como um arquivo binário. Depois, você pode ler o arquivo inteiro dentro, em um comando.

file = File.open("path-to-file.tar.gz", "rb")
contents = file.read

Isso vai te dar o arquivo inteiro em uma string.

Depois disso, você provavelmente vai querer file.close. Se você não fizer isso, file não será fechado até que seja coleta de lixo, por isso seria uma ligeira perda de recursos do sistema enquanto ele estiver aberto.

Outras dicas

Se você precisar de modo binário, você precisa fazê-lo da maneira mais difícil:

s = File.open(filename, 'rb') { |f| f.read }

Se não, mais curto e mais doce é:

s = IO.read(filename)

Para evitar deixar a abrir o arquivo, o melhor é passar um bloco para File.open. Dessa forma, o arquivo será fechado após as executa o bloco.

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }

no OS X são o mesmo por mim ... isso poderia talvez ser mais "\ r" no windows?

em qualquer caso, você pode ser melhor com:

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

Que tal um pouco de segurança de abertura / fecho.

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

Rubi tem leitura binária

data = IO.binread(path/filaname)

ou se menos do que o Ruby 1.9.2

data = IO.read(path/file)

Você provavelmente pode codificar o arquivo tar em Base64. Base 64 lhe dará uma representação ASCII puro do arquivo que você pode armazenar em um arquivo de texto simples. Depois, você pode recuperar o arquivo tar pela decodificação parte de trás do texto.

Você fazer algo como:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

Tem olhada na Base64 Rubydocs para obter uma idéia melhor.

Se você pode codificar o arquivo tar por Base64 (e armazená-lo em um arquivo de texto simples), pode utilizar

File.open("my_tar.txt").each {|line| puts line}

ou

File.new("name_file.txt", "r").each {|line| puts line}

para imprimir cada linha (texto) no cmd.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top