В Ruby существует несколько режимов открытия файлов, каждый из которых определяет, как будет осуществляться работа с файлом. Эти режимы задаются при открытии файла с помощью метода File.open
или аналогичных.
# "r" - только чтение (режим по умолчанию)
file = File.open("example.txt", "r") # Указание режима необязательно
# "r+" - чтение и запись (с начала файла)
file = File.open("example.txt", "r+")
Особенности:
# "w" - только запись (создает или перезаписывает файл)
file = File.open("new.txt", "w")
# "w+" - чтение и запись (создает или перезаписывает файл)
file = File.open("new.txt", "w+")
Особенности:
# "a" - только добавление (создает файл если нужно)
file = File.open("log.txt", "a")
# "a+" - чтение и добавление (создает файл если нужно)
file = File.open("log.txt", "a+")
Особенности:
Для работы с бинарными файлами к любому режиму можно добавить "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", но с проверкой существования
config = File.open("config.yml", "r") do |file|
YAML.load(file)
end
File.open("app.log", "a") do |file|
file.puts "[#{Time.now}] User logged in"
end
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