ФАЙЛЫ
Прежде всего нужно обозначить, что закрытие файла крайне необходимый процесс:
1) открытый файл может быть заблокирован файловой системой для других скриптов
2) при открытии создается file descriptor, их количество ограничено файловой системой, хотя и обычно значение ограничения довольно большое
3) могут произойти race conditions, когда несколько процессов пытаются прочитать/записать один и тот же ресурс (в данном случае файл) в один момент времени
Чтение и вывод
# вывод контента (первой строки) File.open("test.txt") do |file| # открытие файла puts file.gets # вывод контента (первой строки) end # автоматическое закрытие по завершению метода Open, про необходимость закрытия теория выше # Вывод всех строк File.open("test.txt").each do |line| puts line end # Кладем строки файла в array, где каждая новая строка является отдельным элементом массива. Этот метод не рекомендуется использовать если файл большой и нам не нужно сохранять все строки для последующей обработки, а нужно сохранить/изменить только ряд - в таком случае лучше использовать последовательное чтение без сохранения в массив, чтобы не выделять лишнюю память на большое количество данных. array_of_lines = File.readlines("test.txt")
Аналогичный по функции пример, с созданием объекта в File class (проще использовать предыдущий метод):
file = File.new("test.txt") # открытие файла puts file.gets # вывод контента (первой строки) file.close # закрытие, про необходимость закрытия теория выше
Запись
Запись данных с перезаписью контента (w - write) File.open("test.txt", "w") do |file| file.puts "I'm writing line" end Разбор строк: 1) File.open("test.txt", "w") do |file| # открытие файла в режиме записи ("w"), по умолчанию r, список всех возможностей тут (r, r+, w, w+, a, a+) 2) file.puts "I'm writing line" # ввод контента в файл (не последней строкой, а ПОЛНЫМ замещением текущих данных в файле), если файла не существует - он будет создан 3) end # автоматическое закрытие по завершению метода Open, про закрытие подробнее выше Запись данных добивкой, без перезаписи контента (a - append) File.open("test.txt", "a") do |file| file.puts "I'm writing line" end Можно сократить до одной строки (полезно для debug) File.open($log_file, 'a') { |f| f.puts "#{$cur_dt} --- EXCEPTION #{Time.now} mess #{mess} err #{err}" } if $debug == 1
Другие
полезные методы для работы с файлами
# Удаление файла File.delete("file_name_to_delete") # Удаление ряда файлов files_to_delete = ["test1.txt", "test2.txt", "test3.txt"] files_to_delete.each do |file| File.delete(file) end # Rename файла File.rename("file_name_to_rename", "file_name_new") # Проверка на существование файла if File.exists?("test.txt") puts "File test.txt exist!" end # Получаем полный путь файла (по умолчанию директории из которой происходит запуск скрипта + имени файла) на основе относительного puts File.expand_path("test.txt") /var/www/test.txt # Получение имени без расширения и пути puts File.basename("/var/www/test.txt", ".txt") test # Получение директории без имени файла puts File.dirname("/var/www/test.txt") /var/www # Получение атрибутов файла File.size("test.txt") # размер файла в байтах File.mtime("test.txt") # dt последней модификации
ПАПКИ
# Показать текущий относительный путь, по умолчанию равен директории из которой происходит запуск скрипта puts Dir.pwd /home/user # Изменение относительного пути - можно указать полный путь или будет изменение на текущий относительный + новый puts Dir.pwd dir.chdir("new_dir") /home/user/new_dir # Создаем новую директорию Dir.mkdir("new_dir") # Удаляем директорию, директория должна быть пустой (не иметь файлов или других директорий в ней) Dir.delete("new_dir") # Проверяем пустая ли директория Dir.empty?("new_dir") # Итерация по папке с получением имен файлов и директорий в заданной папке (., .. - в элементах это норма, это указатели текущей и корневой директорий). Во вложенных директориях файлы показаны не будут (не рекурсивно). Dir.foreach("test_dir") do |entry| puts entry end # Тоже самое что выше, но умеет работать рекурсивно и фильтровать выборку. contents = Dir.glob("**/*") # ** - рекурсия, * - условия выборки aka wildcard (* - никаких, *.txt - только .txt) contents.each do |entry| puts entry end # Получаем массив из имен файлов и директорий в заданной папке (., .. - в элементах это норма, это указатели текущей и корневой директорий) Dir.entries("test_dir")