Ruby - Файловый ввод-вывод
Ruby предоставляет целый набор связанных с вводом-выводом методов, реализованных в модуле ядра. Все методы ввода-вывода являются производными от класса IO.
Класс IO предоставляет все основные методы, такие как чтение, запись, получение, размещение, чтение, getc и printf .
В этой главе будут рассмотрены все основные функции ввода-вывода, доступные в Ruby. Дополнительные функции см. В Ruby Class IO .
Заявление пут
В предыдущих главах вы присвоили значения переменным, а затем распечатали результат с помощью оператора put .
Оператор put указывает программе отобразить значение, хранящееся в переменной. Это добавит новую строку в конец каждой записываемой строки.
пример
#!/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
В отличие от помещает заявление, который выводит всю строку на экран, то putc оператор можно использовать для вывода одного символа в то время.
пример
Результатом следующего кода является просто символ H -
#!/usr/bin/ruby
str = "Hello Ruby!"
putc str
Это даст следующий результат -
H
Заявление о печати
Оператор печати похож на оператор put . Единственное отличие состоит в том, что оператор put переходит на следующую строку после печати содержимого, тогда как с оператором печати курсор располагается на той же строке.
пример
#!/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
Sr.No. | Режимы и описание |
---|---|
1 | r Режим только для чтения. Указатель файла помещается в начало файла. Это режим "по умолчанию". |
2 | r+ Режим чтения-записи. Указатель файла будет в начале файла. |
3 | w Режим только для записи. Заменяет файл, если он существует. Если файл не существует, создает новый файл для записи. |
4 | w+ Режим чтения-записи. Заменяет существующий файл, если он существует. Если файл не существует, создает новый файл для чтения и записи. |
5 | a Режим только для записи. Указатель файла находится в конце файла, если файл существует. То есть файл находится в режиме добавления. Если файл не существует, создается новый файл для записи. |
6 | a+ Режим чтения и записи. Указатель файла находится в конце файла, если файл существует. Файл открывается в режиме добавления. Если файл не существует, создается новый файл для чтения и записи. |
Чтение и запись файлов
Те же методы, которые мы использовали для «простого» ввода-вывода, доступны для всех файловых объектов. Итак, get читает строку из стандартного ввода, а 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 и строкой чтения метода заключается в том, что метод foreach связан с блоком. Однако, в отличие от метода readlines , метод foreach не возвращает массив. Например -
#!/usr/bin/ruby
IO.foreach("input.txt"){|block| puts block}
Этот код будет передавать содержимое файла test построчно в блок переменных, а затем вывод будет отображаться на экране.
Переименование и удаление файлов
Вы можете переименовывать и удалять файлы программно с помощью 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 )
Sr.No. | Маска и описание |
---|---|
1 | 0700 маска rwx для владельца |
2 | 0400 r для владельца |
3 | 0200 w для владельца |
4 | 0100 x для владельца |
5 | 0070 rwx маска для группы |
6 | 0040 r для группы |
7 | 0020 w для группы |
8 | 0010 x для группы |
9 | 0007 маска rwx для других |
10 | 0004 r для других |
11 | 0002 w для других |
12 | 0001 x для других |
13 | 4000 Установить идентификатор пользователя при выполнении |
14 | 2000 Установить идентификатор группы при выполнении |
15 | 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 определяет тип файла, возвращая одно из следующих значений: file, directory, 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 -
NOTE - Маска 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 .