Ruby - Arquivo I / O

Ruby fornece um conjunto completo de métodos relacionados a E / S implementados no módulo Kernel. Todos os métodos de I / O são derivados da classe IO.

A classe IO fornece todos os métodos básicos, como read, write, gets, puts, readline, getc e printf .

Este capítulo cobrirá todas as funções básicas de I / O disponíveis em Ruby. Para obter mais funções, consulte Ruby Class IO .

A declaração puts

Nos capítulos anteriores, você atribuiu valores a variáveis ​​e depois imprimiu a saída usando a instrução puts .

A instrução puts instrui o programa a exibir o valor armazenado na variável. Isso adicionará uma nova linha ao final de cada linha escrita.

Exemplo

#!/usr/bin/ruby

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

Isso produzirá o seguinte resultado -

This is variable one
This is variable two

A declaração de get

A instrução gets pode ser usada para obter qualquer entrada do usuário da tela padrão chamada STDIN.

Exemplo

O código a seguir mostra como usar a instrução gets. Este código solicitará que o usuário insira um valor, que será armazenado em uma variável val e, finalmente, será impresso em STDOUT.

#!/usr/bin/ruby

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

Isso produzirá o seguinte resultado -

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

A declaração putc

Ao contrário da instrução puts , que exibe toda a string na tela, a instrução putc pode ser usada para exibir um caractere por vez.

Exemplo

A saída do código a seguir é apenas o caractere H -

#!/usr/bin/ruby

str = "Hello Ruby!"
putc str

Isso produzirá o seguinte resultado -

H

A declaração de impressão

A instrução print é semelhante à instrução puts . A única diferença é que a instrução puts vai para a próxima linha depois de imprimir o conteúdo, enquanto com a instrução print o cursor é posicionado na mesma linha.

Exemplo

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

Isso produzirá o seguinte resultado -

Hello WorldGood Morning

Abrindo e fechando arquivos

Até agora, você leu e gravou na entrada e na saída padrão. Agora, veremos como brincar com arquivos de dados reais.

O Método File.new

Você pode criar um objeto File usando o método File.new para leitura, gravação ou ambos, de acordo com a string de modo. Finalmente, você pode usar o método File.close para fechar esse arquivo.

Sintaxe

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

O método File.open

Você pode usar o método File.open para criar um novo objeto de arquivo e atribuir esse objeto de arquivo a um arquivo. No entanto, há uma diferença entre File.Open e File.New métodos. A diferença é que o método File.open pode ser associado a um bloco, enquanto você não pode fazer o mesmo usando o método File.new .

File.open("filename", "mode") do |aFile|
   # ... process the file
end
Sr. Não. Modos e descrição
1

r

Modo somente leitura. O ponteiro do arquivo é colocado no início do arquivo. Este é o modo padrão.

2

r+

Modo de leitura e gravação. O ponteiro do arquivo estará no início do arquivo.

3

w

Modo somente gravação. Substitui o arquivo se ele existir. Se o arquivo não existir, cria um novo arquivo para gravação.

4

w+

Modo de leitura e gravação. Substitui o arquivo existente, se o arquivo existir. Se o arquivo não existir, cria um novo arquivo para leitura e gravação.

5

a

Modo somente gravação. O ponteiro do arquivo está no final do arquivo se o arquivo existir. Ou seja, o arquivo está no modo de acréscimo. Se o arquivo não existir, ele cria um novo arquivo para gravação.

6

a+

Modo de leitura e gravação. O ponteiro do arquivo está no final do arquivo se o arquivo existir. O arquivo é aberto no modo anexar. Se o arquivo não existir, ele cria um novo arquivo para leitura e gravação.

Ler e escrever arquivos

Os mesmos métodos que temos usado para E / S 'simples' estão disponíveis para todos os objetos de arquivo. Portanto, get lê uma linha da entrada padrão e aFile.gets lê uma linha do objeto de arquivo aFile.

No entanto, os objetos de E / S fornecem um conjunto adicional de métodos de acesso para tornar nossas vidas mais fáceis.

O Método sysread

Você pode usar o método sysread para ler o conteúdo de um arquivo. Você pode abrir o arquivo em qualquer um dos modos ao usar o método sysread. Por exemplo -

A seguir está o arquivo de texto de entrada -

This is a simple text file for testing purpose.

Agora vamos tentar ler este arquivo -

#!/usr/bin/ruby

aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   puts "Unable to open file!"
end

Esta declaração irá gerar os primeiros 20 caracteres do arquivo. O ponteiro do arquivo agora será colocado no 21º caractere no arquivo.

O método syswrite

Você pode usar o método syswrite para gravar o conteúdo em um arquivo. Você precisa abrir o arquivo no modo de gravação ao usar o método syswrite. Por exemplo -

#!/usr/bin/ruby

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

Esta declaração gravará "ABCDEF" no arquivo.

O método each_byte

Este método pertence à classe File . O método each_byte está sempre associado a um bloco. Considere o seguinte exemplo de código -

#!/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

Os caracteres são passados ​​um a um para a variável ch e, em seguida, exibidos na tela da seguinte forma -

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...
.
.

O Método IO.readlines

A classe File é uma subclasse da classe IO. A classe IO também possui alguns métodos que podem ser usados ​​para manipular arquivos.

Um dos métodos da classe IO é IO.readlines . Este método retorna o conteúdo do arquivo linha por linha. O código a seguir exibe o uso do método IO.readlines -

#!/usr/bin/ruby

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

Nesse código, a variável arr é um array. Cada linha do arquivo input.txt será um elemento do array arr. Portanto, arr [0] conterá a primeira linha, enquanto arr [1] conterá a segunda linha do arquivo.

O Método IO.foreach

Este método também retorna a saída linha por linha. A diferença entre o método foreach e o método readlines é que o método foreach está associado a um bloco. No entanto, ao contrário do método readlines , o método foreach não retorna uma matriz. Por exemplo -

#!/usr/bin/ruby

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

Este código irá passar o conteúdo do teste de arquivo linha por linha para o bloco variável e então a saída será exibida na tela.

Renomeando e Excluindo Arquivos

Você pode renomear e excluir arquivos programaticamente com Ruby com os métodos renomear e excluir .

A seguir está o exemplo para renomear um arquivo existente test1.txt -

#!/usr/bin/ruby

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

A seguir está o exemplo para excluir um arquivo existente test2.txt -

#!/usr/bin/ruby

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

Modos de arquivo e propriedade

Use o método chmod com uma máscara para alterar o modo ou as permissões / lista de acesso de um arquivo -

A seguir está o exemplo para alterar o modo de um arquivo existente test.txt para um valor de máscara -

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )
Sr. Não. Máscara e descrição
1

0700

máscara rwx para o proprietário

2

0400

r para dono

3

0200

w para dono

4

0100

x para dono

5

0070

máscara rwx para grupo

6

0040

r para grupo

7

0020

w para o grupo

8

0010

x para grupo

9

0007

máscara rwx para outro

10

0004

r para outro

11

0002

w para outro

12

0001

x para outro

13

4000

Definir o ID do usuário na execução

14

2000

Definir o ID do grupo na execução

15

1000

Salve o texto trocado, mesmo após o uso

Consultas de arquivos

O comando a seguir testa se um arquivo existe antes de abri-lo -

#!/usr/bin/ruby

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

O comando a seguir pergunta se o arquivo é realmente um arquivo -

#!/usr/bin/ruby

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

O seguinte comando descobre se o nome do arquivo fornecido é um diretório -

#!/usr/bin/ruby

# a directory
File::directory?( "/usr/local/bin" ) # => true

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

O comando a seguir descobre se o arquivo é legível, gravável ou executável -

#!/usr/bin/ruby

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

O seguinte comando descobre se o arquivo tem tamanho zero ou não -

#!/usr/bin/ruby

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

O seguinte comando retorna o tamanho do arquivo -

#!/usr/bin/ruby

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

O seguinte comando pode ser usado para descobrir um tipo de arquivo -

#!/usr/bin/ruby

File::ftype( "test.txt" )     # => file

O método ftype identifica o tipo de arquivo retornando um dos seguintes - arquivo, diretório, characterSpecial, blockSpecial, fifo, link, socket ou desconhecido.

O seguinte comando pode ser usado para descobrir quando um arquivo foi criado, modificado ou acessado pela última vez -

#!/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

Diretórios em Ruby

Todos os arquivos estão contidos em vários diretórios, e Ruby não tem problemas em lidar com eles também. Enquanto a classe File lida com arquivos, os diretórios são tratados com a classe Dir .

Navegando pelos diretórios

Para mudar de diretório dentro de um programa Ruby, use Dir.chdir como segue. Este exemplo altera o diretório atual para / usr / bin .

Dir.chdir("/usr/bin")

Você pode descobrir qual é o diretório atual com Dir.pwd -

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

Você pode obter uma lista dos arquivos e diretórios dentro de um diretório específico usando Dir.entries -

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

Dir.entries retorna uma matriz com todas as entradas no diretório especificado. Dir.foreach fornece o mesmo recurso -

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

Uma maneira ainda mais concisa de obter listagens de diretório é usando o método de matriz de classe de Dir -

Dir["/usr/bin/*"]

Criação de um diretório

O Dir.mkdir pode ser usado para criar diretórios -

Dir.mkdir("mynewdir")

Você também pode definir permissões em um novo diretório (não um que já exista) com mkdir -

NOTE - A máscara 755 define as permissões proprietário, grupo, mundo [qualquer um] para rwxr-xr-x onde r = ler, w = escrever e x = executar.

Dir.mkdir( "mynewdir", 755 )

Excluindo um Diretório

O Dir.delete pode ser usado para excluir um diretório. O Dir.unlink e Dir.rmdir desempenham exatamente a mesma função e são fornecidos para sua conveniência.

Dir.delete("testdir")

Criação de arquivos e diretórios temporários

Arquivos temporários são aqueles que podem ser criados brevemente durante a execução de um programa, mas não são um armazenamento permanente de informações.

Dir.tmpdir fornece o caminho para o diretório temporário no sistema atual, embora o método não esteja disponível por padrão. Para disponibilizar Dir.tmpdir é necessário usar require 'tmpdir'.

Você pode usar Dir.tmpdir com File.join para criar um arquivo temporário independente de plataforma -

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)

Este código cria um arquivo temporário, grava dados nele e o exclui. A biblioteca padrão do Ruby também inclui uma biblioteca chamada Tempfile que pode criar arquivos temporários para você -

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

Funções integradas

Aqui estão as funções embutidas do ruby ​​para processar arquivos e diretórios -

  • Classe e métodos de arquivo .

  • Classe e métodos de dir .