Как выполнять операции файлового ввода-вывода?ruby-89

Ruby предоставляет несколько способов работы с файлами через встроенный класс File и модуль IO. Рассмотрим основные операции с подробными примерами.

1. Открытие и закрытие файлов

Базовый способ

file = File.open("example.txt", "r") # Открытие для чтения
content = file.read
file.close # Важно не забыть закрыть файл

Блокированный способ

File.open("example.txt", "r") do |file|
  content = file.read
  # Файл автоматически закроется при выходе из блока
end

2. Режимы открытия файлов

РежимОписание
"r"Только чтение (по умолчанию)
"w"Запись (перезаписывает файл)
"a"Добавление в конец файла
"r+"Чтение и запись
"w+"Чтение и запись (перезаписывает файл)
"a+"Чтение и добавление

3. Основные операции чтения

Чтение всего файла

content = File.read("example.txt")

Построчное чтение

File.foreach("example.txt") do |line|
  puts line
end

Чтение первых N строк

lines = File.readlines("example.txt")[0..4] # Первые 5 строк

4. Основные операции записи

Запись в файл

File.write("output.txt", "Новое содержимое")

Добавление в файл

File.open("output.txt", "a") do |file|
  file.puts "Новая строка в конце файла"
end

Запись массива строк

lines = ["строка 1", "строка 2", "строка 3"]
File.write("lines.txt", lines.join("\n"))

5. Работа с путями и метаданными

Проверка существования файла

if File.exist?("example.txt")
  puts "Файл существует"
end

Получение информации о файле

puts File.size("example.txt") # Размер в байтах
puts File.mtime("example.txt") # Время последнего изменения
puts File.extname("image.jpg") # Расширение файла (.jpg)

Работа с путями

puts File.join("folder", "subfolder", "file.txt") # folder/subfolder/file.txt
puts File.dirname("/path/to/file.txt") # /path/to
puts File.basename("/path/to/file.txt") # file.txt

6. Бинарные файлы

Для работы с бинарными данными нужно использовать соответствующий режим:

# Чтение бинарного файла
data = File.binread("image.png", mode: "rb")

# Запись бинарного файла
File.binwrite("copy.png", data, mode: "wb")

7. Временные файлы

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

require 'tempfile'

temp_file = Tempfile.new('prefix')
temp_file.write("временные данные")
temp_file.close
# Файл автоматически удалится при сборке мусора

8. Лучшие практики

  1. Всегда используйте блоки File.open с do...end для автоматического закрытия
  2. Обрабатывайте исключения при работе с файлами:
begin
  File.read("missing.txt")
rescue Errno::ENOENT => e
  puts "Файл не найден: #{e.message}"
end
  1. Для больших файлов используйте построчное чтение вместо File.read
  2. Используйте File.join вместо ручного соединения путей

Резюмируем

Ruby предоставляет богатый набор методов для файлового ввода-вывода через класс File и модуль IO. Основные операции включают чтение, запись, добавление данных, работу с метаданными и путями. Для безопасной работы с файлами рекомендуется использовать блочную форму File.open и обработку исключений. Для сложных сценариев можно использовать дополнительные библиотеки типа Pathname для работы с путями или CSV для специализированных форматов.