Блог

Ruby: Работа с файлами

Мое знакомство с Ruby. Возможно кому-то пригодится, когда будет начинать его учить. Краткая информация о файлах и директории. Из программ, написанных на Ruby, можно управлять каталогами и файлами при помощи классов Dir и File. Существует еще FileUtils, с множеством интересных методов.

Каталоги
Чтобы работать с каталогами, можно воспользоваться с помощью класса Dir. Основные методы которые используются Dir.pwd, Dir.chdir или Dir.getwd и Dir.mkdir.

Dir.chdir("/var/")
puts Dir.pwd

Если вам необходим каталог, создайте его при помощи mkdir, чтобы удалить его воспользуйтесь rmdir.

Dir.mkdir("/tmp/test")
Dir.rmdir("/tmp/test")

Метод entries класса Dir возвращает массив, который содержит все элементы, найденные в каталоге, включая файлы, скрытые файлы и другие каталоги.

Dir.entries("/tmp").each {|e| p e}

То же самое можно проделать при помощи foreach:

Dir.foreach("/tmp") {| filename | p filename }

Поток каталога
Метод класса open/new отрывает поток каталога.

dir = Dir.open("/tmp")

p dir.path
p dir.tell
p dir.read
p dir.tell
p dir.rewind

dir.each {|e| p e}

dir.close
  • path – сообщает путь потока.
  • tell –  возвращает текущий элемент
  • read – читает из dir следующий доступный элемент
  • rewind – возвращает в начало потока

Файлы
Создаем новый файл
Создать новый файл и в тоже время открыть его, необходимо применить метод new из класс File:

file = File.new('/tmp/file.rb', 'w')

Первый параметр указать путь, а второй определяем режимный код файла, режимы стандартные (r+, w+, a+, b)

Существующий файл открывают с помощью метода open.

file = File.open('/tmp/file')
file.each { | line | p "#{file.lineno} - #{line}" }
file.close

Ещё один интересный способ организации использование глобальный переменных ARGV/ARGF.

Прочитать файл

ARGV << '/tmp/file'
print while gets

ARGV – это массив и каждый его элемент является именем файла. В данном случаи мы добавили имя файла при помощи “<<” метод  из Array.
gets – это метод из Kernel извлекает строки из ARGV и до тех пор, пока возвращает строку.

ARGF – является виртуальной конкатенацией всех файлов, указанных в командной строке.

while line = ARGF.gets
  print line
end

$ ruby main.rb /tmp/file

Удаление и переименовываем файлы
При помощи Ruby можно переименовать/удалить файлы программно, методы rename/delete.

path = '/tmp/'
File::open(path +'test', 'w')
p File::exist?(path +'test')

File::rename(path +'test', path +'change_test')
p File::exist?(path +'change_test')

File::delete(path +'change_test')

p File::exist?(path +'test')
p File::exist?(path +'change_test')

Файловые запросы
Проверка, существует ли файл, прежде чем открыть его:

File::open('/tmp/test') if File::exists?('/tmp/test')

exist? – синоним exists?

Проверить является ли файл действительно файлом

p File.file?('/tmp/test')

Проверить является ли каталогом, указанный адрес

p File::directory?('/tmp')
p File::directory?('/tmp/test')

Метод readable? – предназначен ли файл чтения
Метод writable? – предназначен ли файл записи
Метод executable? – исполняемый ли файл

p File.readable?('/tmp/test')
p File.writable?('/tmp/test')
p File.executable?('/tmp/test')

Метод zero? – имеет ли файл нулевую длину

p File.zero?('/tmp/file')

Метод size? – получить длину файла (*можно и без ?)

p File.size('/tmp/test')

Метод ftype  запросить тип файла

p File.ftype('/tmp/test')

вернет строку с типом файла file, directory, characterSpecial, blockSpecial, fifo, link, socket, или unknown
Метод ctime – когда был создан файл
Метод mtime – когда был изменен файл
Метод atime – когда последний раз обращались к файлу

p File::ctime('/tmp/test')
p File::mtime('/tmp/test')
p File::atime('/tmp/test')

Изменить режимный код файла и владельца
режимный код – это права доступа к файлу, метод chmod с маской как в Unix системе.

file = File.new('/tmp/test', 'w').chmod(0755)

владельца/группу для файла методом chown который подобен команде chown в Unix./

file = File.new('/tmp/test', 'r').chown(33, 33)

Открываем URI

require "open-uri"

url = 'http://ya.ru'
open(url) { |page| p page.read() }

Класс IO
класс IO представляет входные/выходные потоки данных в формате байтов. В потоки входят:

  • $stdin – с клавиатуры
  • $stdout – на дисплей
  • $stderr – выходной поток сообщений об ошибках, по умолчанию на дисплей.

Класс IO тесно связан с классом File.

io = IO.new(1, 'w')
io.puts "IO test"

$stdout.puts "this is a copy"

Первый параметр 1 – это числовой дескриптор файла для стандартного ввода. Стандартный ввод может быть предопределен.

0 – стнд. входной поток, предопределенная переменная $stdin (STDIN – окружение в Ruby)
1 – стнд. выходной поток $stdout (STDOUT)
2 – стнд. поток сообщений об ошибках $stderr (STDERR)

метод экземпляра класса fileno вы можете проверить какой числовой дескриптор файла установлен

p io.fileno
p io.to_i

$stdout.fileno

Метод flush – сбросить буфер, записать строки в поток, при помощи метода << затем сбросить.

io << "This is" << "test"
io.flush

Метод close – закрыть поток.

io = IO.new(1)
io.putc 'R'
io.putc 'u'
io.putc 'b'
io.putc 'y'

io.getc

Поток для файла

file = File.new('/tmp/test')
p file.gets
p file.gets

 

Ссылки
Ruby/Справочник/Dir
Ruby/Справочник/File
Ruby/Справочник/IO
http://ruby-doc.org/
http://www.ruby-lang.org/en/documentation/quickstart/
http://tryruby.org/levels/2/challenges/2
http://www.tutorialspoint.com/ruby/ruby_loops.htm

Книга:
Майкл Фитцджеральд – Изучаем Ruby: 2008