Эликсир - Файловый ввод-вывод
Файловый ввод-вывод является неотъемлемой частью любого языка программирования, поскольку он позволяет языку взаимодействовать с файлами в файловой системе. В этой главе мы обсудим два модуля - Путь и Файл.
Модуль 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)