Potrzebuję łatwego sposobu pobrania pliku tar i przekonwertowania go na ciąg znaków (i odwrotnie). Czy jest na to sposób w Ruby? Moja najlepsza próba była następująca:
file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
contents << line
}
Pomyślałem, że to wystarczy, aby przekonwertować go na ciąg, ale wtedy, gdy próbuję go zapisać z powrotem w ten sposób ...
newFile = File.open("test.tar.gz", "w")
newFile.write(contents)
To nie jest ten sam plik. Wykonanie ls -l
pokazuje, że pliki mają różne rozmiary, chociaż są dość blisko (a otwarcie pliku ujawnia większość zawartości nienaruszonej). Czy popełniam niewielki błąd lub całkowicie inny (ale wykonalny) sposób na osiągnięcie tego?
IO.read
w przeciwnym razie byłaby preferowana odpowiedź.Odpowiedzi:
Najpierw powinieneś otworzyć plik jako plik binarny. Następnie możesz odczytać cały plik za pomocą jednego polecenia.
Otrzymasz cały plik w ciągu.
Potem prawdopodobnie chcesz
file.close
. Jeśli tego nie zrobisz,file
nie zostanie zamknięty, dopóki nie zostanie wyrzucony, więc byłoby to niewielkie marnowanie zasobów systemowych, gdy jest ono otwarte.źródło
contents = (contents of file "path to file.txt" as string)
.begin {..open..} ensure {..close..} end
blokachcontents = File.binread('path-to-file.tar.gz')
Zobacz apidock .File
jest podklasąIO
.Jeśli potrzebujesz trybu binarnego, musisz to zrobić na własnej skórze:
Jeśli nie, krótszy i słodszy to:
źródło
s = File.open(filename, 'rb', &:read)
Aby uniknąć pozostawienia pliku otwartego, najlepiej przekazać blok do pliku File.open. W ten sposób plik zostanie zamknięty po wykonaniu bloku.
źródło
na OS X są dla mnie takie same ... czy może to być dodatkowe „\ r” w systemie Windows?
w każdym razie możesz być lepszy z:
źródło
co powiesz na pewne bezpieczeństwo otwarcia / zamknięcia.
źródło
Ruby ma odczyt binarny
lub jeśli mniej niż Ruby 1.9.2
źródło
Prawdopodobnie możesz zakodować plik tar w Base64. Baza 64 daje czystą reprezentację ASCII pliku, który można przechowywać w zwykłym pliku tekstowym. Następnie możesz odzyskać plik tar dekodując tekst z powrotem.
Robisz coś takiego:
Spójrz na Rubydocs Base64, aby uzyskać lepszy pomysł.
źródło
Jeśli możesz zakodować plik tar za pomocą Base64 (i przechowywać go w zwykłym pliku tekstowym), możesz użyć
lub
aby wydrukować każdą linię (tekstową) w cmd.
źródło