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.


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")

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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.