Файловый ввод-вывод является неотъемлемой частью любого языка программирования, поскольку он позволяет языку взаимодействовать с файлами в файловой системе. В этой главе мы обсудим два модуля — Path и File.
Модуль Path
Модуль path — это очень маленький модуль, который можно рассматривать как вспомогательный модуль для операций с файловой системой. Большинство функций в модуле File ожидают пути в качестве аргументов. Чаще всего эти пути будут обычными двоичными файлами. Модуль Path предоставляет возможности для работы с такими путями. Использование функций из модуля Path, а не просто манипулирование двоичными файлами, является предпочтительным, поскольку модуль Path прозрачно заботится о различных операционных системах. Следует отметить, что Elixir автоматически преобразует косую черту (/) в обратную косую черту (\) в Windows при выполнении файловых операций.
Давайте рассмотрим следующий пример, чтобы лучше понять модуль Path —
IO.puts(Path.join("foo", "bar"))
Когда вышеуказанная программа запущена, она дает следующий результат —
foo/bar
Есть много методов, которые предоставляет модуль path. Вы можете взглянуть на различные методы здесь . Эти методы часто используются, если вы выполняете много операций с файлами.
Файловый модуль
Файловый модуль содержит функции, которые позволяют нам открывать файлы как устройства ввода-вывода. По умолчанию файлы открываются в двоичном режиме, что требует от разработчиков использования определенных функций IO.binread и IO.binwrite из модуля IO. Давайте создадим файл с именем 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, если файл успешно открыт, иначе возникнет ошибка. ПРИМЕЧАНИЕ. Это шаблон, который следует всем функциям файлового модуля, которые мы собираемся обсудить.
Функция 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 —