English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Entrada e Saída de Arquivos do Ruby

Ruby oferece um conjunto completo de I/O métodos relacionados são implementados no módulo Kernel. Todos os I/O método deriva da classe IO.

classe IO 提供了一整套基础的方法,例如 read、write、gets、puts、readline、getcprintf.

Este capítulo explicará todos os I básicos disponíveis no Ruby/Funções. Para mais informações sobre as funções, consulte o Ruby IO classe.

puts instrução

Nos capítulos anteriores, você atribuiu valores às variáveis e usou puts A instrução imprime a saída.

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

Exemplo Online

#!/usr/bin/ruby
 
val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2

Os resultados de execução dos exemplos acima são:

This is variable one
This is variable two

gets instrução

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

Exemplo Online

O código a seguir demonstra como usar a instrução gets. O código solicitará ao usuário para inserir um valor, que será armazenado na variável val e, finalmente, será impresso no STDOUT.

Exemplo Online

#!/usr/bin/ruby
 
puts "Enter a value :"
val = gets
puts val

Os resultados de execução dos exemplos acima são:

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

putc instrução

é diferente de puts A instruçãoputs A instrução output a string inteira para a tela, enquanto putc A instrução pode ser usada para output caracter por caracter.

Exemplo Online

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

Exemplo Online

#!/usr/bin/ruby
 
str="Hello Ruby!"
putc str

Os resultados de execução dos exemplos acima são:

H

print instrução

print instrução puts é semelhante. A única diferença está na puts A instrução pula para a próxima linha após concluir o conteúdo de saída, enquanto a instrução print Quando a instrução print é executada, o cursor é posicionado na mesma linha.

Exemplo Online

#!/usr/bin/ruby
 
print "Hello World"
print "Good Morning"

Os resultados de execução dos exemplos acima são:

Hello WorldGood Morning

Abrir e fechar arquivos

Até agora, você já leu e escreveu na entrada e saída padrão. Agora, vamos ver como operar arquivos de dados reais.

File.new método

您可以使用 File.new Método para criar um File Objeto usado para leitura, escrita ou leitura/escrita, as permissões de leitura/escrita dependem do parâmetro mode. Finalmente, você pode usar File.close Método para fechar o arquivo.

Sintaxe

aFile = File.new("filename", "mode")
   # ... Tratar o arquivo
aFile.close

File.open método

您可以使用 File.open O método cria um novo objeto file e atribui esse objeto file ao arquivo. Mas,File.openFile.new Existem algumas diferenças entre os métodos. A diferença é File.open Método pode ser associado a um bloco, enquanto File.new Método não pode.

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

下表列出了打开文件的不同模式:

模式descrição
r只读模式。文件指针被放置在文件的开头。这是默认模式。
r+读写模式。文件指针被放置在文件的开头。
w只写模式。如果文件存在,则重写文件。如果文件不存在,则创建一个新文件用于写入。
w+读写模式。如果文件存在,则重写已存在的文件。如果文件不存在,则创建一个新文件用于读写。
a只写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于写入。
a+读写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于读写。

读取和写入文件

用于简单 I/O 的方法也可用于所有 file 对象。所以,gets 从标准输入读取一行,aFile.gets 从文件对象 aFile 读取一行。

但是,I/O 对象提供了访问方法的附加设置,为我们提供了便利。

sysread método

您可以使用方法 sysread 来读取文件的内容。当使用方法 sysread 时,您可以使用任意一种模式打开文件。例如:

下面是输入文本文件:

This is a simple text file for testing purpose.

现在让我们尝试读取这个文件:

Exemplo Online

#!/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 método

您可以使用方法 syswrite 来向文件写入内容。当使用方法 syswrite 时,您需要以写入模式打开文件。例如:

Exemplo Online

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

该语句将写入 "ABCDEF" 到文件中。

each_byte método

该方法属于类 File。方法 each_byte 是个可以迭代字符串中每个字符。请看下面的代码示例:

Exemplo Online

#!/usr/bin/ruby
 
aFile = File.new("input.txt", "r"+")
if aFile
   aFile.syswrite("ABCDEF")
   aFile.rewind
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   puts "Unable to open file!"
end

caractere por caractere é passado para a variável ch e exibido na tela, conforme mostrado a seguir:

A.B.C.D.E.F.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 método

classe File é uma subclasse da classe IO. A classe IO também possui métodos para operar arquivos.

IO.readlines é um método da classe IO. Este método retorna o conteúdo do arquivo linha por linha. O código a seguir mostra o método IO.readlines uso:

Exemplo Online

#!/usr/bin/ruby
 
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

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

IO.foreach método

Este método também retorna a saída linha por linha. O método foreach metodo readlines diferente do método foreach associado ao bloco. No entanto, ao contrário do método readlines,método foreach não retorna um array. Por exemplo:

Exemplo Online

#!/usr/bin/ruby
 
IO.foreach("input.txt"){|block| puts block}

este código passará o arquivo test o conteúdo do arquivo é passado linha a linha para a variável block, e a saída será exibida na tela.

renomear e excluir arquivos

您可以通过 renamedelete métodos para renomear e excluir arquivos.

abaixo está um exemplo de renomeação de um arquivo existente test1.txt

Exemplo Online

#!/usr/bin/ruby
 
# renomeia arquivo test1.txt para test2.txt
File.rename( "test1.txt", "test2.txt" )

abaixo está um exemplo de exclusão de um arquivo existente test2.txt

Exemplo Online

#!/usr/bin/ruby
 
# exclui arquivo test2.txt
File.delete("text2.txt")

modo do arquivo e propriedade

usando máscara com chmod método para alterar o modo ou permissões do arquivo/lista de acesso:

abaixo está um exemplo de alteração de um arquivo existente test.txt o modo é um valor de máscara:

Exemplo Online

#!/usr/bin/ruby
 
file = File.new( "test.txt", "w" )
file.chmod( 0755 )

a tabela a seguir lista chmod máscaras diferentes disponíveis no método:

掩码descrição
0700máscara rwx, aplicável ao proprietário
0400r, aplicável ao proprietário
0200w, aplicável ao proprietário
0100x, aplicável ao proprietário
0070máscara rwx, aplicável ao grupo
0040r, para o grupo
0020w, para o grupo
0010x, para o grupo
0007máscara rwx, para outros
0004r, para outros
0002w, para outros
0001x, para outros
4000Define o ID do usuário ao executar
2000Define o ID do grupo do proprietário ao executar
1000Salva texto de troca, mesmo após o uso

Pesquisa de arquivo

Os seguintes comandos verificam se o arquivo existe antes de abri-lo:

Exemplo Online

#!/usr/bin/ruby
 
File.open("file.rb") if File::exists?("file.rb")

Os seguintes comandos consultam se o arquivo realmente é um arquivo:

Exemplo Online

#!/usr/bin/ruby
 
# Retorna true ou false
File.file?("text.txt")

Os seguintes comandos verificam se o nome do arquivo fornecido é um diretório:

Exemplo Online

#!/usr/bin/ruby
 
# Uma diretório
File::directory?("/usr/local/bin") => true
 
# Um arquivo
File::directory?("file.rb") => false

Os seguintes comandos verificam se o arquivo é legível, gravável ou executável:

Exemplo Online

#!/usr/bin/ruby
 
File.readable?("test.txt") => true
File.writable?("test.txt") => true
File.executable?("test.txt") => false

Os seguintes comandos verificam se o tamanho do arquivo é zero:

Exemplo Online

#!/usr/bin/ruby
 
File.zero?("test.txt") => true

Os seguintes comandos retornam o tamanho do arquivo:

Exemplo Online

#!/usr/bin/ruby
 
File.size?("text.txt") => 1002

Os seguintes comandos são usados para verificar o tipo do arquivo:

Exemplo Online

#!/usr/bin/ruby
 
File::ftype("test.txt") => file

O método ftype identifica o tipo do arquivo retornando um dos seguintes valores:file, directory, characterSpecial, blockSpecial, fifo, link, socket ou unknown.

Os seguintes comandos são usados para verificar o tempo de criação, modificação ou acesso do arquivo:

Exemplo Online

#!/usr/bin/ruby
 
File::ctime("test.txt") => Sex May 09 10:06:37 -0700 2008
File::mtime("text.txt") => Sex May 09 10:44:44 -0700 2008
File::atime("text.txt") => Sex 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 # 返回当前目录,类似 /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 设置所有者(owner)、所属组(group)、每个人(world [anyone])的权限为 rwxr-xr-x,其中 r = read 读取,w = write 写入,x = execute 执行。

Dir.mkdir( "mynewdir", 755 )

删除目录

Dir.delete 可用于删除目录。Dir.unlinkDir.rmdir 执行同样的功能,为我们提供了便利。

Dir.delete("testdir")

创建文件 & 临时目录

临时文件是那些在程序执行过程中被简单地创建,但不会永久性存储的信息。

Dir.tmpdir 提供了当前系统上临时目录的路径,但是该方法默认情况下是不可用的。为了让 Dir.tmpdir 可用,使用必需的 'tmpdir' 是必要的。

您可以把 Dir.tmpdirFile.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)

Este código cria um arquivo temporário, escreve dados nele e depois exclui o arquivo. A biblioteca padrão do Ruby também contém uma chamada Tempfile do biblioteca, que pode ser usada para criar arquivos temporários:

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

Funções Integradas

A seguir, fornece-se uma lista completa de funções integradas para o tratamento de arquivos e diretórios no Ruby: