Учебники

Ruby — File I / O

Ruby предоставляет полный набор методов ввода-вывода, реализованных в модуле Kernel. Все методы ввода / вывода являются производными от класса IO.

Класс IO предоставляет все основные методы, такие как чтение, запись, получение, ввод, readline, getc и printf .

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

Заявление пут

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

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

пример

Live Demo

#!/usr/bin/ruby

val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2

Это даст следующий результат —

This is variable one
This is variable two

Заявление получает

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

пример

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

#!/usr/bin/ruby

puts "Enter a value :"
val = gets
puts val

Это даст следующий результат —

Enter a value :
This is entered value
This is entered value

Заявление Putc

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

пример

Вывод следующего кода — это просто символ H —

Live Demo

#!/usr/bin/ruby

str = "Hello Ruby!"
putc str

Это даст следующий результат —

H

Заявление о печати

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

пример

Live Demo

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

Это даст следующий результат —

Hello WorldGood Morning

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

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

Метод File.new

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

Синтаксис

aFile = File.new("filename", "mode")
   # ... process the file
aFile.close

Метод File.open

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

File.open("filename", "mode") do |aFile|
   # ... process the file
end

р

Режим только для чтения. Указатель файла находится в начале файла. Это режим «по умолчанию».

г +

Режим чтения-записи. Указатель файла будет в начале файла.

вес

Режим только для записи. Перезаписывает файл, если файл существует. Если файл не существует, создает новый файл для записи.

ш +

Режим чтения-записи. Перезаписывает существующий файл, если файл существует. Если файл не существует, создает новый файл для чтения и записи.

Режим только для записи. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, он создает новый файл для записи.

а +

Режим чтения и записи. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, он создает новый файл для чтения и записи.

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

Те же методы, которые мы использовали для «простого» ввода-вывода, доступны для всех файловых объектов. Итак, gets читает строку из стандартного ввода, а 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 "Unable to open file!"
end

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

Метод syswrite

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

#!/usr/bin/ruby

aFile = File.new("input.txt", "r+")
if aFile
   aFile.syswrite("ABCDEF")
else
   puts "Unable to open file!"
end

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

Метод each_byte

Этот метод относится к классу 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 "Unable to open file!"
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

Класс File является подклассом класса 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}

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

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

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

Ниже приведен пример для переименования существующего файла 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 )

0700

RWX маска для владельца

0400

г для владельца

0200

ж для владельца

0100

х для владельца

0070

RWX маска для группы

0040

г для группы

0020

W для группы

0010

х для группы

0007

RWX маска для других

0004

г для других

0002

ш для других

0001

х для других

4000

Установить идентификатор пользователя при исполнении

2000

Установить идентификатор группы при исполнении

1000

Сохранить замененный текст даже после использования

Запросы файлов

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

#!/usr/bin/ruby

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

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

#!/usr/bin/ruby

# This returns either true or false
File.file?( "text.txt" ) 

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

#!/usr/bin/ruby

# a directory
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" )     # => file

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

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

#!/usr/bin/ruby

File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008

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

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

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

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

Dir.chdir("/usr/bin")

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

puts Dir.pwd # This will return something like /usr/bin

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

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

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

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

Еще более краткий способ получения списка каталогов — использование метода массива классов Dir —

Dir["/usr/bin/*"]

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

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

Dir.mkdir("mynewdir")

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

ПРИМЕЧАНИЕ. — Маска 755 устанавливает для владельца прав, группы, мира [любого] значение rwxr-xr-x, где r = чтение, w = запись и x = выполнение.

Dir.mkdir( "mynewdir", 755 )

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

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

Dir.delete("testdir")

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

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

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

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

require 'tmpdir'
   tempfilename = File.join(Dir.tmpdir, "tingtong")
   tempfile = File.new(tempfilename, "w")
   tempfile.puts "This is a temporary file"
   tempfile.close
   File.delete(tempfilename)

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

require 'tempfile'
   f = Tempfile.new('tingtong')
   f.puts "Hello"
   puts f.path
   f.close

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

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

Класс файла и методы .

Класс Dir и Методы .