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 .