Какие существуют режимы файлового ввода-вывода?ruby-90

В Ruby существует несколько режимов открытия файлов, каждый из которых определяет, как будет осуществляться работа с файлом. Эти режимы задаются при открытии файла с помощью метода File.open или аналогичных.

Основные режимы открытия файлов

1. Режимы только для чтения

# "r" - только чтение (режим по умолчанию)
file = File.open("example.txt", "r") # Указание режима необязательно

# "r+" - чтение и запись (с начала файла)
file = File.open("example.txt", "r+")

Особенности:

  • Файл должен существовать
  • Указатель находится в начале файла
  • "r+" позволяет и читать, и писать

2. Режимы записи

# "w" - только запись (создает или перезаписывает файл)
file = File.open("new.txt", "w")

# "w+" - чтение и запись (создает или перезаписывает файл)
file = File.open("new.txt", "w+")

Особенности:

  • Если файл существует, он будет перезаписан
  • Если файл не существует, он будет создан
  • Указатель находится в начале файла

3. Режимы добавления

# "a" - только добавление (создает файл если нужно)
file = File.open("log.txt", "a")

# "a+" - чтение и добавление (создает файл если нужно)
file = File.open("log.txt", "a+")

Особенности:

  • Указатель находится в конце файла
  • Данные всегда добавляются в конец
  • Чтение возможно только в режиме "a+"

4. Бинарные режимы

Для работы с бинарными файлами к любому режиму можно добавить "b":

# Бинарное чтение
file = File.open("image.png", "rb")

# Бинарная запись
file = File.open("data.bin", "wb")

Таблица всех режимов

РежимЧтениеЗаписьСоздает файлПерезаписываетПозиция указателяБинарный вариант
rДаНетНетНетНачалоrb
r+ДаДаНетНетНачалоr+b или rb+
wНетДаДаДаНачалоwb
w+ДаДаДаДаНачалоw+b или wb+
aНетДаДаНетКонецab
a+ДаДаДаНетКонецa+b или ab+

Специальные режимы и флаги

В современных версиях Ruby появились дополнительные флаги:

# "t" - явное указание текстового режима (по умолчанию)
file = File.open("text.txt", "rt")

# "x" - эксклюзивное создание (ошибка если файл существует)
file = File.open("new.txt", "x") # Аналог "w", но с проверкой существования

Примеры использования разных режимов

1. Чтение конфигурационного файла

config = File.open("config.yml", "r") do |file|
  YAML.load(file)
end

2. Логирование в файл

File.open("app.log", "a") do |file|
  file.puts "[#{Time.now}] User logged in"
end

3. Работа с бинарными данными

File.open("image_copy.jpg", "wb") do |output|
  output.write(File.read("original.jpg", mode: "rb"))
end

Обработка ошибок при выборе режима

Некоторые режимы могут вызывать исключения:

begin
  File.open("missing.txt", "r")
rescue Errno::ENOENT
  puts "Файл не найден!"
end

begin
  File.open("existing.txt", "x")
rescue Errno::EEXIST
  puts "Файл уже существует!"
end

Резюмируем

Ruby предоставляет богатый набор режимов для работы с файлами:

  • Основные режимы: r, w, a и их комбинации с +
  • Бинарные режимы с суффиксом b
  • Специальные флаги типа x для эксклюзивного создания
  • Выбор режима зависит от требуемых операций (чтение/запись) и позиционирования
  • Важно учитывать поведение при существовании/отсутствии файла
  • Для текстовых данных обычно используют режимы без b, для бинарных - с b