Przeczytaj plik binarny jako ciąg w Ruby

głosy
258

Muszę w łatwy sposób do podjęcia pliku smoły i przekształcić go w ciąg (i odwrotnie). Czy istnieje sposób, aby zrobić to w Ruby? Moja najlepsza próba była to:

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

Myślałem, że to wystarczy, aby przekształcić go na sznurku, ale wtedy, gdy próbuję napisać to wycofać się tak ...

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

To nie jest ten sam plik. Robi ls -lpokazuje pliki są w różnych rozmiarach, chociaż są one dość blisko (i otwierania pliku ujawnia większość treści nienaruszone). Jest tam mały błąd Robię lub zupełnie inny (ale wykonalne) drogą do osiągnięcia tego celu?

Utwórz 25/09/2008 o 02:18
źródło użytkownik
W innych językach...                            


8 odpowiedzi

głosy
384

Po pierwsze, należy otworzyć plik w formacie binarnym. Następnie można odczytać cały plik, w jednym poleceniu.

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

Że będzie Ci cały plik na sznurku.

Po tym, prawdopodobnie chcesz file.close. Jeśli nie zrobisz, filenie zostaną zamknięte, dopóki nie jest śmieci zebrane, więc byłoby niewielkie marnotrawstwo zasobów systemowych, gdy jest on otwarty.

Odpowiedział 25/09/2008 o 02:30
źródło użytkownik

głosy
237

Jeśli potrzebujesz trybu binarnego, trzeba zrobić to w przykry sposób:

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

Jeśli nie, krótsze i słodsza jest:

s = IO.read(filename)
Odpowiedział 07/11/2008 o 06:24
źródło użytkownik

głosy
113

Aby uniknąć pozostawienia plik otwarty, to najlepiej zdać blok File.Open. W ten sposób plik zostanie zamknięty po sporządzi blokowych.

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }
Odpowiedział 25/09/2008 o 03:02
źródło użytkownik

głosy
17

jak o jakimś otwarty / zamknięty bezpieczeństwa.

string = File.open('file.txt', 'rb') { |file| file.read }
Odpowiedział 30/12/2010 o 19:21
źródło użytkownik

głosy
16

na OS X są takie same dla mnie ... może to może być bardzo „\ r” w oknach?

w każdym przypadku może być lepiej z:

contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)
Odpowiedział 25/09/2008 o 02:27
źródło użytkownik

głosy
6

Ruby mieć odczyt binarny

data = IO.binread(path/filaname)

lub jeżeli mniej niż Ruby 1.9.2

data = IO.read(path/file)
Odpowiedział 12/06/2015 o 09:02
źródło użytkownik

głosy
4

Prawdopodobnie można zakodować plik tar w Base64. Podstawa 64 daje czysty ASCII pliku, który można przechowywać w pliku tekstowym. Następnie można pobrać plik tar poprzez dekodowanie tekstu powrotem.

Można zrobić coś takiego:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

Mieć spojrzenie na base64 Rubydocs aby uzyskać lepszy pomysł.

Odpowiedział 25/09/2008 o 02:27
źródło użytkownik

głosy
0

Jeśli można zakodować plik tar przez Base64 (i przechowywanie go w pliku tekstowym) można użyć

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

lub

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

wydrukować każdą linię (tekst) w cmd.

Odpowiedział 24/11/2014 o 11:31
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more