Wczytaj zawartość lokalnego pliku do zmiennej w Railsach

86

Chcę tylko pobrać całą zawartość z pliku lokalnego i zapisać ją w zmiennej. W jaki sposób?

File.read(@icon.full_filename).each {|l| r += l}

daje mi tylko część tego. W PHP właśnie użyłem file_get_contents.

Steven
źródło
1
Uważam, że jest to wyjątkowy problem z systemem Windows, ponieważ to rozwiązanie i to zaproponowane przez zed_0xff działają doskonale na komputerach Mac / Linux. Wiem, że irb zmienia się \ r \ n na \ n podczas wykonywania funkcji File.read ... może to ma tu znaczenie?
Steven

Odpowiedzi:

163
data = File.read("/path/to/file")
zed_0xff
źródło
1
Myślałem, że tak, ale to daje mi ciąg o długości 52. Rzeczywisty rozmiar pliku, kiedy idę Plik.size ("/ ścieżka / do / pliku") to 1676.
Steven
4
Czy to nie pozostawia otwartego pliku?
Tom Rossi,
Podoba mi się ten! Byłoby miło wiedzieć, jak zachować nagłówki z typu zawartości pliku
Tom Roggero
Jest to przydatne do czytania bez użycia bloku, umożliwiając łatwą analizę zawartości i ustawienie na zmienne dostępne dla innych bloków bez konieczności tworzenia klasy.
Andrew,
3
Odpowiadając na pytanie @ TomRossi - nie, to nie pozostawia otwartego pliku. Wywołanie odczytu w klasie File otwiera, odczytuje i zamyka plik. Jednak wywołanie odczytu instancji pliku (która musiała zostać otwarta jako pierwsza) nie zamyka go. Wywoływana tutaj metoda to ruby-doc.org/core-2.5.0/IO.html#method-c-read w przeciwieństwie do ruby-doc.org/core-2.5.0/IO.html#method-i- czytaj
AndrewKS
18

Myślę, że powinieneś rozważyć użycie, IO.binread("/path/to/file")jeśli masz niedawnego interpretera ruby ​​(tj.> = 1.9.2)

IODokumentację klas można znaleźć tutaj http://www.ruby-doc.org/core-2.1.2/IO.html

Mehdi
źródło
2
To jest krótsze i zamyka plik za Ciebie.
Rob
16

Odpowiadając tutaj na moje własne pytanie ... okazuje się, że jest to tylko dziwactwo systemu Windows, które ma miejsce podczas czytania plików binarnych (w moim przypadku JPEG), które wymagają dodatkowej flagi w wywołaniu funkcji open lub File.open. Poprawiłem to open("/path/to/file", 'rb') {|io| a = a + io.read}i wszystko było w porządku.

Steven
źródło
10
O ile nie łączysz ze sobą kilku plików, napiszę to jako:data = File.open("file", "rb") {|io| io.read}
glenn jackman
Pan zasługuje na medal. Straciłem godziny, próbując dowiedzieć się, dlaczego moje załączniki PDF były nieczytelne po wysłaniu z serwera Windows, dopóki nie natknąłem się na tę odpowiedź.
Augusto Samamé Barrientos