Идеи могут быть обезврежены только идеями (О. Бальзак).

Ruby – File I/O

7 мин для чтения
FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...
23 августа 2018
Как написать первую программу на Ruby
Ruby предоставляет целый набор связанных с I/O методов, реализованных в модуле Kernel. Все методы ввода-вывода получены из класса IO.

Класс IO предоставляет все основные методы, такие как read, write, gets, puts, readline, getc, and printf.

В этой главе будут рассмотрены все основные функции ввода-вывода, доступные в Ruby. Дополнительные функции см. В Ruby Class IO.

Заявление puts

В предыдущих главах вы присвоили значения переменным, а затем распечатали результат с помощью оператора puts.

Оператор puts указывает программе отображать значение, хранящееся в переменной. Это добавит новую строку в конце каждой строки, которую она пишет.

Пример

#!/usr/bin/ruby

val1 = "Это одна переменная"
val2 = "Это две переменных"
puts val1
puts val2

 

Это приведет к следующему результату:

Это одна переменная
Это две переменных

 

Заявление gets

Оператор gets может использоваться для ввода любого ввода от пользователя со стандартного экрана STDIN.

Пример

Следующий код показывает, как использовать оператор gets. Этот код предложит пользователю ввести значение, которое будет храниться в переменной val и, наконец, будет напечатано на STDOUT.

#!/usr/bin/ruby

puts "Введите значение :"
val = gets
puts val

 

Это приведет к следующему результату:

Введите значение :
Это введенное значение
Это введенное значение

 

Заявление putc

В отличие от оператора puts, который выводит всю строку на экран, оператор putc может использоваться для вывода одного символа за раз.

Пример

Результатом следующего кода является только символ H:

#!/usr/bin/ruby

str = "Привет, Ruby!"
putc str

 

Это приведет к следующему результату:

H

 

Заявление print

Оператор print похож на оператор puts. Единственное отличие состоит в том, что оператор puts переходит к следующей строке после печати содержимого, тогда как с оператором print курсор помещается в одну строку.

Пример

#!/usr/bin/ruby

print "Привет Мир"
print "Доброе утро"

 

Это приведет к следующему результату:

Привет МирДоброе утро

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

До сих пор вы читали и записывали стандартный ввод и вывод. Теперь мы увидим, как играть с фактическими файлами данных.

Метод File.new

Вы можете создать объект File, используя метод File.new для чтения, записи или и того и другого, в соответствии с строкой режима. Наконец, вы можете использовать метод File.close для закрытия этого файла.

Синтаксис

aFile = File.new("filename", "mode")
   # ... обработать файл
aFile.close

Метод File.open

Вы можете использовать метод File.open для создания нового файлового объекта и назначить этот файловый объект файлу. Однако существует одна разница между методами File.open и File.new. Разница в том, что метод File.open может быть связан с блоком, тогда как вы не можете сделать то же самое с помощью метода File.new.

File.open("filename", "mode") do |aFile|
   # ... обработать файл
end

 

Чтение и запись файлов

Те же методы, которые мы использовали для «простых» операций ввода-вывода, доступны для всех объектов файлов. Таким образом, считывается строка из стандартного ввода, а aFile.gets считывает строку из файлового объекта aFile.

Однако объекты ввода-вывода предоставляют дополнительный набор методов доступа, облегчающих нашу жизнь.

Метод sysread

Вы можете использовать метод sysread для чтения содержимого файла. Вы можете открыть файл в любом из режимов при использовании метода sysread. Например,

Ниже приведен входной текстовый файл:

This is a simple text file for testing purpose.

 

Теперь попробуем прочитать этот файл:

#!/usr/bin/ruby

aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   puts "Невозможно открыть файл!"
end

 

Этот оператор выведет первые 20 символов файла. Указатель файла теперь будет помещен в 21-й символ в файле.

Метод syswrite

Вы можете использовать метод syswrite для записи содержимого в файл. Вам нужно открыть файл в режиме записи при использовании метода syswrite. Например,

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
else
   puts "Невозможно открыть файл!"
end

 

Этот оператор напишет «ABCDEF» в файл.

Метод each_byte

Этот метод принадлежит к классe file. Метод each_byte всегда связан с блоком. Рассмотрим следующий пример кода:

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   puts "Невозможно открыть файл!"
end

 

Символы передаются один за другим переменной ch и затем отображаются на экране следующим образом:

s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.

Метод IO.readlines

Файл класса является подклассом класса IO. Класс IO также имеет некоторые методы, которые могут использоваться для управления файлами.

Одним из методов класса IO является IO.readlines. Этот метод возвращает содержимое файла по строкам. Следующий код показывает использование метода IO.readlines:

#!/usr/bin/ruby

arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

 

В этом коде переменная arr является массивом. Каждая строка файла input.txt будет элементом в массиве arr. Следовательно, arr [0] будет содержать первую строку, тогда как arr [1] будет содержать вторую строку файла.

Метод IO.foreach

Этот метод также возвращает вывод строки за строкой. Разница между методом foreach и метода readlines заключается в том, что метод foreach связан с блоком. Однако, в отличие от метода readlines, метод foreach не возвращает массив. Например,

#!/usr/bin/ruby

IO.foreach("input.txt"){|block| puts block}

 

Этот код передает содержимое файла test по строке в блок переменной, а затем вывод будет отображаться на экране.

Переименование и удаление файлов

Вы можете переименовывать и удалять файлы программно в Ruby с помощью методов rename и delete.

Ниже приведен пример переименования существующего файла test1.txt:

#!/usr/bin/ruby

# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )

 

Ниже приведен пример удаления существующего файла test2.txt:

#!/usr/bin/ruby

# Delete file test2.txt
File.delete("test2.txt")

 

Режимы файлов и права собственности

Используйте метод chmod с маской для изменения режима или списка разрешений/доступа к файлу:

Ниже приведен пример изменения режима существующего файла test.txt на значение маски:

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )

 

Запросы к файлам

Следующая команда проверяет, существует ли файл перед его открытием:

#!/usr/bin/ruby

File.open("file.rb") if File::exists?( "file.rb" )

 

Следующая команда запрашивает, действительно ли файл является файлом:

#!/usr/bin/ruby

# Возвращает значение true или false
File.file?( "text.txt" )

 

Следующая команда обнаруживает, является ли данное имя файла каталогом:

#!/usr/bin/ruby

# каталог
File::directory?( "/usr/local/bin" ) # => true

# a file
File::directory?( "file.rb" ) # => false

 

Следующая команда определяет, является ли файл доступным для чтения, записываемый или исполняемый файл:

#!/usr/bin/ruby

File.readable?( "test.txt" )   # => true
File.writable?( "test.txt" )   # => true
File.executable?( "test.txt" ) # => false

 

Следующая команда определяет, имеет ли файл нулевой размер или нет:

#!/usr/bin/ruby

File.zero?( "test.txt" )      # => true

 

Следующая команда возвращает размер файла:

#!/usr/bin/ruby

File.size?( "text.txt" )     # => 1002

 

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

#!/usr/bin/ruby

File::ftype( "test.txt" )     # => файл

 

Метод ftype идентифицирует тип файла, возвращая один из следующих: file, directory, characterSpecial, blockSpecial, fifo, link, socket, or unknown.

Следующая команда может использоваться, чтобы найти, когда файл был создан, изменен или последний доступ:

#!/usr/bin/ruby

File::ctime( "test.txt" ) # => The Aug 23 12:21:21:0700 2018
File::mtime( "text.txt" ) # => The Aug 23 12:25:56:0700 2018
File::atime( "text.txt" ) # => The Aug 23 12:45:24:0700 2018

 

Справочники в Ruby

Все файлы содержатся в разных каталогах, и Ruby не имеет проблем с этим. В то время как класс File обрабатывает файлы, каталоги обрабатываются классом Dir.

Навигация по каталогам

Чтобы изменить каталог в программе Ruby, используйте Dir.chdir следующим образом. Этот пример изменяет текущий каталог на /usr/bin.

Dir.chdir("/usr/bin")

 

Вы можете узнать, что представляет собой текущий каталог с Dir.pwd:

puts Dir.pwd # Это вернет что-то вроде /usr/bin

 

Вы можете получить список файлов и каталогов в определенном каталоге, используя Dir.entries:

puts Dir.entries("/usr/bin").join(' ')

 

Dir.entries возвращает массив со всеми элементами в указанном каталоге. Dir.foreach предоставляет ту же самую функцию:

Dir.foreach("/usr/bin") do |entry|
   puts entry
end

 

Еще более сжатый способ получения каталогов: использование метода массива Dir’s class:

Dir["/usr/bin/*"]

 

Создание каталога

Dir.mkdir может быть использован для создания каталогов:

Dir.mkdir("andreyexnewdir")

 

Вы также можете установить разрешения для нового каталога (не одного, который уже существует) с помощью mkdir:

Примечание
Маска 755 устанавливает права owner, group, world [anyone] на rwxr-xr-x, где r = read, w = write и x = execute.
Dir.mkdir( "andreyexnewdir", 755 )

 

Удаление каталога

Dir.delete может быть использован для удаления каталога. Dir.unlink и Dir.rmdir выполняет точно такую же функцию и предоставляются для удобства.

Dir.delete("andreyextestdir")

 

Создание файлов и временных каталогов

Временные файлы: это те, которые могут быть созданы ненадолго во время выполнения программы, но не являются постоянным хранилищем информации.

Dir.tmpdir предоставляет путь к временному каталогу в текущей системе, хотя метод по умолчанию недоступен. Чтобы сделать доступным Dir.tmpdir, необходимо использовать require ‘tmpdir’.

Вы можете использовать Dir.tmpdir с File.join для создания независимого от платформы временного файла:

require 'tmpdir'
   tempfilename = File.join(Dir.tmpdir, "andreyex")
   tempfile = File.new(tempfilename, "w")
   tempfile.puts "Это временный файл"
   tempfile.close
   File.delete(tempfilename)

 

Этот код создает временный файл, записывает в него данные и удаляет его. Стандартная библиотека Ruby также включает библиотеку под названием Tempfile, которая может создавать для вас временные файлы:

require 'tempfile'
   f = Tempfile.new('andreyex')
   f.puts "Привет"
   puts f.path
   f.close

 

Встроенные функции

Вот встроенные функции для обработки файлов и каталогов:

  • Класс и методы File.
  • Класс и методы Dir.

 

Просмотров: 47

Если статья понравилась, то поделитесь ей в социальных сетях:

Читайте также

    Добавить комментарий

    Войти с помощью: 

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

    badge
    Обратный звонок 1
    Отправить
    galka

    Спасибо! Ваша заявка принята

    close
    galka

    Спасибо! Ваша заявка принята

    close