Elixir - plik IO

File IO jest integralną częścią każdego języka programowania, ponieważ umożliwia interakcję języka z plikami w systemie plików. W tym rozdziale omówimy dwa moduły - Path i File.

Moduł ścieżki

Plik pathmodule to bardzo mały moduł, który można uznać za moduł pomocniczy dla operacji systemu plików. Większość funkcji w module File oczekuje ścieżek jako argumentów. Najczęściej te ścieżki będą zwykłymi plikami binarnymi. Moduł Ścieżka zapewnia ułatwienia do pracy z takimi ścieżkami. Korzystanie z funkcji z modułu Path, a nie tylko manipulowanie plikami binarnymi, jest preferowane, ponieważ moduł Path w przejrzysty sposób obsługuje różne systemy operacyjne. Należy zauważyć, że Elixir automatycznie konwertuje ukośniki (/) na ukośniki odwrotne (\) w systemie Windows podczas wykonywania operacji na plikach.

Rozważmy następujący przykład, aby lepiej zrozumieć moduł Ścieżka -

IO.puts(Path.join("foo", "bar"))

Uruchomienie powyższego programu daje następujący wynik -

foo/bar

Moduł ścieżki udostępnia wiele metod. Można spojrzeć na różnych metod tutaj . Te metody są często używane, jeśli wykonujesz wiele operacji na plikach.

Moduł plików

Moduł plików zawiera funkcje, które pozwalają nam otwierać pliki jako urządzenia IO. Domyślnie pliki są otwierane w trybie binarnym, co wymaga od programistów używania określonegoIO.binread i IO.binwritefunkcje z modułu IO. Utwórzmy plik o nazwienewfile i zapisz do niego jakieś dane.

{:ok, file} = File.read("newfile", [:write]) 
# Pattern matching to store returned stream
IO.binwrite(file, "This will be written to the file")

Jeśli przejdziesz do otwarcia pliku, do którego właśnie zapisaliśmy, zawartość zostanie wyświetlona w następujący sposób -

This will be written to the file

Zrozummy teraz, jak używać modułu plików.

Otwieranie pliku

Aby otworzyć plik, możemy użyć jednej z następujących 2 funkcji -

{:ok, file} = File.open("newfile")
file = File.open!("newfile")

Zrozummy teraz różnicę między File.open funkcja i File.open!() funkcjonować.

  • Plik File.openfunkcja zawsze zwraca krotkę. Jeśli plik zostanie pomyślnie otwarty, zwraca pierwszą wartość w krotce jako:oka druga wartość jest literałem typu io_device. Jeśli wystąpi błąd, zwróci krotkę z pierwszą wartością jako:error i druga wartość jako powód.

  • Plik File.open!() funkcja z drugiej strony zwróci io_devicejeśli plik zostanie pomyślnie otwarty, w przeciwnym razie spowoduje to błąd. UWAGA: To jest wzorzec stosowany we wszystkich funkcjach modułu plików, które będziemy omawiać.

Możemy również określić tryby, w których chcemy otworzyć ten plik. Aby otworzyć plik tylko do odczytu i w trybie kodowania utf-8, używamy następującego kodu -

file = File.open!("newfile", [:read, :utf8])

Zapisywanie do pliku

Mamy dwa sposoby zapisywania do plików. Przyjrzyjmy się pierwszemu, używając funkcji write z modułu File.

File.write("newfile", "Hello")

Ale nie powinno to być używane, jeśli dokonujesz wielu zapisów do tego samego pliku. Za każdym razem, gdy ta funkcja jest wywoływana, otwierany jest deskryptor pliku i pojawia się nowy proces zapisujący w pliku. Jeśli wykonujesz wiele zapisów w pętli, otwórz plik za pomocąFile.openi napisz do niego używając metod w module IO. Rozważmy przykład, aby zrozumieć to samo -

#Open the file in read, write and utf8 modes. 
file = File.open!("newfile_2", [:read, :utf8, :write])

#Write to this "io_device" using standard IO functions
IO.puts(file, "Random text")

Możesz użyć innych metod modułu IO, takich jak IO.write i IO.binwrite zapisywać do plików otwartych jako io_device.

Czytanie z pliku

Mamy dwa sposoby czytania z plików. Przyjrzyjmy się pierwszemu przy użyciu funkcji read z modułu File.

IO.puts(File.read("newfile"))

Podczas uruchamiania tego kodu powinieneś otrzymać krotkę z pierwszym elementem jako :ok a drugi jako zawartość newfile

Możemy również użyć File.read! funkcji, aby po prostu pobrać zawartość zwróconych nam plików.

Zamykanie otwartego pliku

Za każdym razem, gdy otwierasz plik za pomocą funkcji File.open, po zakończeniu korzystania z niego należy go zamknąć za pomocą rozszerzenia File.close funkcja -

File.close(file)