Эликсир - Файловый ввод-вывод

Файловый ввод-вывод является неотъемлемой частью любого языка программирования, поскольку он позволяет языку взаимодействовать с файлами в файловой системе. В этой главе мы обсудим два модуля - Путь и Файл.

Модуль Path

В pathmodule - это очень маленький модуль, который можно рассматривать как вспомогательный модуль для операций с файловой системой. Большинство функций в модуле File ожидают пути в качестве аргументов. Чаще всего это обычные двоичные файлы. Модуль Path предоставляет возможности для работы с такими путями. Использование функций из модуля Path, а не просто манипулирование двоичными файлами предпочтительнее, поскольку модуль Path прозрачно заботится о различных операционных системах. Следует отметить, что Elixir автоматически преобразует косую черту (/) в обратную косую черту (\) в Windows при выполнении файловых операций.

Давайте рассмотрим следующий пример, чтобы лучше понять модуль Path -

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

Когда вышеуказанная программа запускается, она дает следующий результат -

foo/bar

Модуль path предоставляет множество методов. Вы можете ознакомиться с различными методами здесь . Эти методы часто используются, если вы выполняете много операций с файлами.

Файловый модуль

Файловый модуль содержит функции, которые позволяют нам открывать файлы как устройства ввода-вывода. По умолчанию файлы открываются в двоичном режиме, что требует от разработчиков использования специальногоIO.binread и IO.binwriteфункции из модуля ввода-вывода. Давайте создадим файл с именемnewfile и напишите в него данные.

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

Если вы откроете файл, в который мы только что записали, содержимое будет отображаться следующим образом:

This will be written to the file

Давайте теперь поймем, как использовать файловый модуль.

Открытие файла

Чтобы открыть файл, мы можем использовать любую из следующих двух функций:

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

Давайте теперь поймем разницу между File.open функция и File.open!() функция.

  • В File.openфункция всегда возвращает кортеж. Если файл успешно открыт, он возвращает первое значение в кортеже как:okа второе значение - литерал типа io_device. Если возникла ошибка, он вернет кортеж с первым значением как:error и второе значение как причина.

  • В File.open!() функция с другой стороны вернет io_deviceесли файл успешно открыт, иначе это вызовет ошибку. ПРИМЕЧАНИЕ. Это шаблон, которому следуют все функции файловых модулей, которые мы собираемся обсудить.

Мы также можем указать режимы, в которых мы хотим открыть этот файл. Чтобы открыть файл только для чтения и в режиме кодировки utf-8, мы используем следующий код -

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

Запись в файл

У нас есть два способа записи в файлы. Давайте посмотрим на первый, используя функцию записи из модуля File.

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

Но это не следует использовать, если вы делаете несколько записей в один и тот же файл. Каждый раз, когда эта функция вызывается, открывается дескриптор файла и запускается новый процесс для записи в файл. Если вы выполняете несколько операций записи в цикле, откройте файл черезFile.openи напишите в него, используя методы модуля IO. Давайте рассмотрим пример, чтобы понять то же самое -

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

Вы можете использовать другие методы модуля ввода-вывода, например IO.write и IO.binwrite для записи в файлы, открытые как io_device.

Чтение из файла

У нас есть два способа читать из файлов. Давайте посмотрим на первый, используя функцию чтения из модуля File.

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

При запуске этого кода вы должны получить кортеж с первым элементом как :ok а второй - как содержимое newfile

Мы также можем использовать File.read! функция, чтобы просто получить содержимое возвращенных нам файлов.

Закрытие открытого файла

Каждый раз, когда вы открываете файл с помощью функции File.open, после того, как вы закончили его использовать, вы должны закрыть его с помощью File.close функция -

File.close(file)