Ruby - plik I / O

Ruby udostępnia cały zestaw metod związanych z I / O zaimplementowanych w module jądra. Wszystkie metody I / O pochodzą z klasy IO.

Klasa IO zapewnia wszystkie podstawowe metody, takie jak odczyt, zapis, pobieranie, umieszczanie, readline, getc i printf .

Ten rozdział omawia wszystkie podstawowe funkcje I / O dostępne w Rubim. Aby uzyskać więcej funkcji, zapoznaj się z Ruby Class IO .

Oświadczenie puts

W poprzednich rozdziałach przypisałeś wartości zmiennym, a następnie wydrukowałeś dane wyjściowe za pomocą instrukcji puts .

Instrukcja puts instruuje program, aby wyświetlić wartość przechowywaną w zmiennej. Spowoduje to dodanie nowej linii na końcu każdego zapisywanego wiersza.

Przykład

#!/usr/bin/ruby

val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2

To da następujący wynik -

This is variable one
This is variable two

Instrukcja gets

Instrukcja gets może służyć do pobierania dowolnych danych wejściowych od użytkownika ze standardowego ekranu o nazwie STDIN.

Przykład

Poniższy kod pokazuje, jak używać instrukcji gets. Ten kod zachęci użytkownika do wprowadzenia wartości, która zostanie zapisana w zmiennej val i na koniec zostanie wydrukowana na STDOUT.

#!/usr/bin/ruby

puts "Enter a value :"
val = gets
puts val

To da następujący wynik -

Enter a value :
This is entered value
This is entered value

Instrukcja putc

W przeciwieństwie do instrukcji puts , która wyświetla cały ciąg na ekranie, instrukcja putc może być używana do wyświetlania jednego znaku na raz.

Przykład

Dane wyjściowe następującego kodu to tylko znak H -

#!/usr/bin/ruby

str = "Hello Ruby!"
putc str

To da następujący wynik -

H

Instrukcja print

Instrukcja print jest podobna do instrukcji puts . Jedyną różnicą jest to, że instrukcja puts przechodzi do następnego wiersza po wydrukowaniu zawartości, podczas gdy w przypadku instrukcji print kursor jest ustawiany w tym samym wierszu.

Przykład

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

To da następujący wynik -

Hello WorldGood Morning

Otwieranie i zamykanie plików

Do tej pory czytałeś i zapisywałeś na standardowe wejście i wyjście. Teraz zobaczymy, jak grać z rzeczywistymi plikami danych.

Metoda File.new

Możesz utworzyć obiekt File przy użyciu metody File.new do odczytu, zapisu lub obu, zgodnie z ciągiem trybu. Na koniec możesz użyć metody File.close , aby zamknąć ten plik.

Składnia

aFile = File.new("filename", "mode")
   # ... process the file
aFile.close

Metoda File.open

Możesz użyć metody File.open , aby utworzyć nowy obiekt pliku i przypisać ten obiekt plikowy do pliku. Istnieje jednak jedna różnica między metodami File.open i File.new . Różnica polega na tym, że metoda File.open może być skojarzona z blokiem, podczas gdy nie można tego zrobić za pomocą metody File.new .

File.open("filename", "mode") do |aFile|
   # ... process the file
end
Sr.No. Tryby i opis
1

r

Tryb tylko do odczytu. Wskaźnik pliku jest umieszczany na początku pliku. To jest tryb domyślny.

2

r+

Tryb do odczytu i zapisu. Wskaźnik pliku będzie na początku pliku.

3

w

Tryb tylko do zapisu. Zastępuje plik, jeśli istnieje. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

4

w+

Tryb do odczytu i zapisu. Zastępuje istniejący plik, jeśli plik istnieje. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

5

a

Tryb tylko do zapisu. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Oznacza to, że plik jest w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do zapisu.

6

a+

Tryb odczytu i zapisu. Wskaźnik pliku znajduje się na końcu pliku, jeśli plik istnieje. Plik otwiera się w trybie dołączania. Jeśli plik nie istnieje, tworzy nowy plik do odczytu i zapisu.

Czytanie i pisanie plików

Te same metody, których używaliśmy do „prostego” wejścia / wyjścia, są dostępne dla wszystkich obiektów plików. Zatem pobiera wiersz ze standardowego wejścia, a aFile.gets odczytuje wiersz z obiektu pliku aFile.

Jednak obiekty we / wy zapewniają dodatkowy zestaw metod dostępu, aby ułatwić nam życie.

Metoda sysread

Możesz użyć metody sysread, aby odczytać zawartość pliku. Możesz otworzyć plik w dowolnym trybie podczas korzystania z metody sysread. Na przykład -

Poniżej znajduje się wejściowy plik tekstowy -

This is a simple text file for testing purpose.

Teraz spróbujmy przeczytać ten plik -

#!/usr/bin/ruby

aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   puts "Unable to open file!"
end

Ta instrukcja wyświetli pierwsze 20 znaków pliku. Wskaźnik pliku zostanie teraz umieszczony na 21. znaku w pliku.

Metoda syswrite

Możesz użyć metody syswrite, aby zapisać zawartość do pliku. Musisz otworzyć plik w trybie zapisu, gdy używasz metody syswrite. Na przykład -

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
else
   puts "Unable to open file!"
end

Ta instrukcja zapisze „ABCDEF” do pliku.

Metoda each_byte

Ta metoda należy do klasy File . Metoda each_byte jest zawsze skojarzona z blokiem. Rozważ następujący przykład kodu -

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   puts "Unable to open file!"
end

Znaki są przekazywane jeden po drugim do zmiennej ch, a następnie wyświetlane na ekranie w następujący sposób -

s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.

Metoda IO.readlines

Klasa File jest podklasą klasy IO. Klasa IO ma również pewne metody, których można używać do manipulowania plikami.

Jedną z metod klasy IO jest IO.readlines . Ta metoda zwraca zawartość pliku wiersz po wierszu. Poniższy kod wyświetla użycie metody IO.readlines -

#!/usr/bin/ruby

arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

W tym kodzie zmienna arr jest tablicą. Każda linia pliku input.txt będzie elementem tablicy arr. Dlatego arr [0] będzie zawierał pierwszą linię, podczas gdy arr [1] będzie zawierał drugą linię pliku.

Metoda IO.foreach

Ta metoda zwraca również dane wyjściowe wiersz po wierszu. Różnica między metodą foreach a metodą readlines polega na tym, że metoda foreach jest skojarzona z blokiem. Jednak w przeciwieństwie do metody readlines metoda foreach nie zwraca tablicy. Na przykład -

#!/usr/bin/ruby

IO.foreach("input.txt"){|block| puts block}

Ten kod przekaże zawartość pliku testowego wiersz po wierszu do bloku zmiennej, a następnie dane wyjściowe zostaną wyświetlone na ekranie.

Zmiana nazwy i usuwanie plików

Możesz zmieniać nazwy i usuwać pliki programowo za pomocą Rubiego za pomocą metod zmiany nazwy i usuwania .

Poniżej znajduje się przykład zmiany nazwy istniejącego pliku test1.txt -

#!/usr/bin/ruby

# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )

Poniżej znajduje się przykład usuwania istniejącego pliku test2.txt -

#!/usr/bin/ruby

# Delete file test2.txt
File.delete("test2.txt")

Tryby plików i własność

Użyj metody chmod z maską, aby zmienić tryb lub uprawnienia / listę dostępu do pliku -

Poniżej znajduje się przykład zmiany trybu istniejącego pliku test.txt na wartość maski -

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )
Sr.No. Maska i opis
1

0700

maska ​​rwx dla właściciela

2

0400

r jak właściciel

3

0200

w dla właściciela

4

0100

x dla właściciela

5

0070

maska ​​rwx dla grupy

6

0040

r jak grupa

7

0020

w dla grupy

8

0010

x dla grupy

9

0007

rwx maska ​​dla innych

10

0004

r dla innych

11

0002

w dla innych

12

0001

x dla innych

13

4000

Ustaw identyfikator użytkownika podczas wykonywania

14

2000

Ustaw identyfikator grupy podczas wykonywania

15

1000

Zapisz zamieniony tekst, nawet po użyciu

Zapytania dotyczące plików

Następujące polecenie sprawdza, czy plik istnieje przed jego otwarciem -

#!/usr/bin/ruby

File.open("file.rb") if File::exists?( "file.rb" )

Następujące polecenie sprawdza, czy plik jest naprawdę plikiem -

#!/usr/bin/ruby

# This returns either true or false
File.file?( "text.txt" )

Następujące polecenie sprawdza, czy podana nazwa pliku jest katalogiem -

#!/usr/bin/ruby

# a directory
File::directory?( "/usr/local/bin" ) # => true

# a file
File::directory?( "file.rb" ) # => false

Następujące polecenie sprawdza, czy plik jest możliwy do odczytu, zapisywalny lub wykonywalny -

#!/usr/bin/ruby

File.readable?( "test.txt" )   # => true
File.writable?( "test.txt" )   # => true
File.executable?( "test.txt" ) # => false

Następujące polecenie sprawdza, czy plik ma zerowy rozmiar, czy nie -

#!/usr/bin/ruby

File.zero?( "test.txt" )      # => true

Następujące polecenie zwraca rozmiar pliku -

#!/usr/bin/ruby

File.size?( "text.txt" )     # => 1002

Poniższego polecenia można użyć, aby znaleźć typ pliku -

#!/usr/bin/ruby

File::ftype( "test.txt" )     # => file

Metoda ftype identyfikuje typ pliku, zwracając jedną z następujących wartości - plik, katalog, znakSpecial, blokSpecial, FIFO, łącze, gniazdo lub nieznane.

Poniższego polecenia można użyć do znalezienia czasu utworzenia, modyfikacji lub ostatniego dostępu do pliku -

#!/usr/bin/ruby

File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

Katalogi w Rubim

Wszystkie pliki są zawarte w różnych katalogach, a Ruby nie ma problemu z ich obsługą. Podczas gdy klasa File obsługuje pliki, katalogi są obsługiwane przez klasę Dir .

Poruszanie się po katalogach

Aby zmienić katalog w programie Ruby, użyj Dir.chdir w następujący sposób. Ten przykład zmienia bieżący katalog na / usr / bin .

Dir.chdir("/usr/bin")

Możesz dowiedzieć się, jaki jest bieżący katalog za pomocą Dir.pwd -

puts Dir.pwd # This will return something like /usr/bin

Możesz uzyskać listę plików i katalogów w określonym katalogu za pomocą Dir.entries -

puts Dir.entries("/usr/bin").join(' ')

Dir.entries zwraca tablicę ze wszystkimi wpisami w określonym katalogu. Dir.foreach zapewnia tę samą funkcję -

Dir.foreach("/usr/bin") do |entry|
   puts entry
end

Jeszcze bardziej zwięzłym sposobem uzyskiwania list katalogów jest użycie metody tablicowej klas Dira -

Dir["/usr/bin/*"]

Tworzenie katalogu

Dir.mkdir mogą być wykorzystywane do tworzenia katalogów -

Dir.mkdir("mynewdir")

Możesz także ustawić uprawnienia do nowego katalogu (nie takiego, który już istnieje) za pomocą mkdir -

NOTE - Maska 755 ustawia uprawnienia właściciela, grupy, świata [każdy] na rwxr-xr-x, gdzie r = odczyt, w = zapis, a x = wykonanie.

Dir.mkdir( "mynewdir", 755 )

Usuwanie katalogu

Do usunięcia katalogu można użyć Dir.delete . W Dir.unlink i Dir.rmdir wykonuje dokładnie te same funkcje i są przewidziane dla wygody.

Dir.delete("testdir")

Tworzenie plików i katalogów tymczasowych

Pliki tymczasowe to te, które mogą zostać utworzone na krótko podczas wykonywania programu, ale nie są trwałym magazynem informacji.

Dir.tmpdir zawiera ścieżkę do katalogu tymczasowego w bieżącym systemie, chociaż metoda ta nie jest domyślnie dostępna. Aby udostępnić Dir.tmpdir , należy użyć wymagania „tmpdir”.

Możesz użyć Dir.tmpdir z File.join, aby utworzyć plik tymczasowy niezależny od platformy -

require 'tmpdir'
   tempfilename = File.join(Dir.tmpdir, "tingtong")
   tempfile = File.new(tempfilename, "w")
   tempfile.puts "This is a temporary file"
   tempfile.close
   File.delete(tempfilename)

Ten kod tworzy plik tymczasowy, zapisuje w nim dane i usuwa go. Standardowa biblioteka Ruby zawiera również bibliotekę o nazwie Tempfile, która może tworzyć dla Ciebie pliki tymczasowe -

require 'tempfile'
   f = Tempfile.new('tingtong')
   f.puts "Hello"
   puts f.path
   f.close

Wbudowane funkcje

Oto wbudowane funkcje Ruby do przetwarzania plików i katalogów -

  • Klasa i metody plików .

  • Dir Class and Methods .