Ruby: E / S de archivos

Ruby proporciona un conjunto completo de métodos relacionados con E / S implementados en el módulo Kernel. Todos los métodos de E / S se derivan de la clase IO.

La clase IO proporciona todos los métodos básicos, como leer, escribir, obtener, poner, readline, getc y printf .

Este capítulo cubrirá todas las funciones básicas de E / S disponibles en Ruby. Para obtener más funciones, consulte Ruby Class IO .

La declaración de put

En los capítulos anteriores, asignó valores a las variables y luego imprimió la salida usando la declaración de venta .

El pone declaración da instrucciones al programa para que muestre el valor almacenado en la variable. Esto agregará una nueva línea al final de cada línea que escriba.

Ejemplo

#!/usr/bin/ruby

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

Esto producirá el siguiente resultado:

This is variable one
This is variable two

La declaración de gets

La instrucción gets se puede utilizar para tomar cualquier entrada del usuario desde la pantalla estándar llamada STDIN.

Ejemplo

El siguiente código le muestra cómo usar la instrucción gets. Este código le pedirá al usuario que ingrese un valor, que se almacenará en una variable val y finalmente se imprimirá en STDOUT.

#!/usr/bin/ruby

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

Esto producirá el siguiente resultado:

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

La declaración de putc

A diferencia de la pone declaración, que emite la cadena completa en la pantalla, el putc declaración puede ser usada para dar salida a un carácter a la vez.

Ejemplo

La salida del siguiente código es solo el carácter H -

#!/usr/bin/ruby

str = "Hello Ruby!"
putc str

Esto producirá el siguiente resultado:

H

La declaración impresa

La declaración de impresión es similar a la declaración de venta . La única diferencia es que la instrucción put pasa a la siguiente línea después de imprimir el contenido, mientras que con la instrucción print el cursor se coloca en la misma línea.

Ejemplo

#!/usr/bin/ruby

print "Hello World"
print "Good Morning"

Esto producirá el siguiente resultado:

Hello WorldGood Morning

Abrir y cerrar archivos

Hasta ahora, ha estado leyendo y escribiendo en la entrada y salida estándar. Ahora, veremos cómo jugar con archivos de datos reales.

El método File.new

Puede crear un objeto File utilizando el método File.new para leer, escribir o ambos, según la cadena de modo. Finalmente, puede usar el método File.close para cerrar ese archivo.

Sintaxis

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

El método File.open

Puede utilizar el método File.open para crear un nuevo objeto de archivo y asignar ese objeto de archivo a un archivo. Sin embargo, hay una diferencia entre los métodos File.open y File.new . La diferencia es que el método File.open se puede asociar con un bloque, mientras que no se puede hacer lo mismo con el método File.new .

File.open("filename", "mode") do |aFile|
   # ... process the file
end
No Señor. Modos y descripción
1

r

Modo de solo lectura. El puntero de archivo se coloca al principio del archivo. Este es el modo por defecto.

2

r+

Modo lectura-escritura. El puntero del archivo estará al principio del archivo.

3

w

Modo de solo escritura. Sobrescribe el archivo si existe. Si el archivo no existe, crea un nuevo archivo para escribir.

4

w+

Modo lectura-escritura. Sobrescribe el archivo existente si el archivo existe. Si el archivo no existe, crea un nuevo archivo para leer y escribir.

5

a

Modo de solo escritura. El puntero de archivo está al final del archivo si el archivo existe. Es decir, el archivo está en modo adjuntar. Si el archivo no existe, crea un nuevo archivo para escribir.

6

a+

Modo de lectura y escritura. El puntero de archivo está al final del archivo si el archivo existe. El archivo se abre en modo anexar. Si el archivo no existe, crea un nuevo archivo para lectura y escritura.

Leer y escribir archivos

Los mismos métodos que hemos estado usando para E / S 'simples' están disponibles para todos los objetos de archivo. Entonces, gets lee una línea de la entrada estándar y aFile.gets lee una línea del objeto de archivo aFile.

Sin embargo, los objetos de E / S proporcionan un conjunto adicional de métodos de acceso para facilitar nuestras vidas.

El método sysread

Puede utilizar el método sysread para leer el contenido de un archivo. Puede abrir el archivo en cualquiera de los modos cuando utilice el método sysread. Por ejemplo

A continuación se muestra el archivo de texto de entrada:

This is a simple text file for testing purpose.

Ahora intentemos leer este archivo:

#!/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 declaración generará los primeros 20 caracteres del archivo. El puntero del archivo ahora se colocará en el carácter 21 del archivo.

El método syswrite

Puede utilizar el método syswrite para escribir el contenido en un archivo. Debe abrir el archivo en modo escritura cuando utilice el método syswrite. Por ejemplo

#!/usr/bin/ruby

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

Esta declaración escribirá "ABCDEF" en el archivo.

El método each_byte

Este método pertenece a la clase File . El método each_byte siempre está asociado con un bloque. Considere el siguiente ejemplo 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

Los caracteres se pasan uno por uno a la variable ch y luego se muestran en la pantalla de la siguiente manera:

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

El método IO.readlines

La clase File es una subclase de la clase IO. La clase IO también tiene algunos métodos, que pueden usarse para manipular archivos.

Uno de los métodos de la clase IO es IO.readlines . Este método devuelve el contenido del archivo línea por línea. El siguiente código muestra el uso del método IO.readlines -

#!/usr/bin/ruby

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

En este código, la variable arr es una matriz. Cada línea del archivo input.txt será un elemento de la matriz arr. Por lo tanto, arr [0] contendrá la primera línea, mientras que arr [1] contendrá la segunda línea del archivo.

El método IO para cada uno

Este método también devuelve la salida línea por línea. La diferencia entre el método foreach y el método readlines es que el método foreach está asociado con un bloque. Sin embargo, a diferencia del método readlines , el método foreach no devuelve una matriz. Por ejemplo

#!/usr/bin/ruby

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

Este código pasará el contenido del archivo de prueba línea por línea al bloque de variables, y luego la salida se mostrará en la pantalla.

Cambiar el nombre y eliminar archivos

Puede cambiar el nombre y eliminar archivos mediante programación con Ruby con los métodos de cambio de nombre y eliminación .

A continuación se muestra el ejemplo para cambiar el nombre de un archivo existente test1.txt :

#!/usr/bin/ruby

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

A continuación se muestra el ejemplo para eliminar un archivo test2.txt existente :

#!/usr/bin/ruby

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

Modos de archivo y propiedad

Use el método chmod con una máscara para cambiar el modo o los permisos / lista de acceso de un archivo -

A continuación se muestra el ejemplo para cambiar el modo de un archivo test.txt existente a un valor de máscara:

#!/usr/bin/ruby

file = File.new( "test.txt", "w" )
file.chmod( 0755 )
No Señor. Máscara y descripción
1

0700

máscara rwx para el propietario

2

0400

r para propietario

3

0200

w para propietario

4

0100

x para propietario

5

0070

máscara rwx para grupo

6

0040

r para grupo

7

0020

w para grupo

8

0010

x para grupo

9

0007

máscara rwx para otros

10

0004

r para otros

11

0002

w para otros

12

0001

x para otro

13

4000

Establecer ID de usuario en ejecución

14

2000

Establecer ID de grupo en ejecución

15

1000

Guarde el texto intercambiado, incluso después de su uso

Consultas de archivos

El siguiente comando prueba si un archivo existe antes de abrirlo:

#!/usr/bin/ruby

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

El siguiente comando pregunta si el archivo es realmente un archivo:

#!/usr/bin/ruby

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

El siguiente comando averigua si el nombre de archivo dado es un directorio:

#!/usr/bin/ruby

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

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

El siguiente comando busca si el archivo se puede leer, escribir o ejecutar:

#!/usr/bin/ruby

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

El siguiente comando busca si el archivo tiene tamaño cero o no:

#!/usr/bin/ruby

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

El siguiente comando devuelve el tamaño del archivo:

#!/usr/bin/ruby

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

El siguiente comando se puede utilizar para encontrar un tipo de archivo:

#!/usr/bin/ruby

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

El método ftype identifica el tipo de archivo al devolver uno de los siguientes: archivo, directorio, characterSpecial, blockSpecial, FIFo, link, socket o unknown.

El siguiente comando se puede usar para encontrar cuándo se creó, modificó o accedió por última vez a un archivo:

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

Directorios en Ruby

Todos los archivos están contenidos en varios directorios y Ruby no tiene problemas para manejarlos también. Mientras que la clase File maneja archivos, los directorios se manejan con la clase Dir .

Navegar por directorios

Para cambiar de directorio dentro de un programa Ruby, use Dir.chdir de la siguiente manera. Este ejemplo cambia el directorio actual a / usr / bin .

Dir.chdir("/usr/bin")

Puede averiguar cuál es el directorio actual con Dir.pwd -

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

Puede obtener una lista de los archivos y directorios dentro de un directorio específico usando Dir.entries -

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

Dir.entries devuelve una matriz con todas las entradas dentro del directorio especificado. Dir.foreach ofrece la misma función:

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

Una forma aún más concisa de obtener listados de directorios es utilizando el método de matriz de clases de Dir:

Dir["/usr/bin/*"]

Crear un directorio

El Dir.mkdir se puede utilizar para crear directorios:

Dir.mkdir("mynewdir")

También puede establecer permisos en un nuevo directorio (no uno que ya exista) con mkdir -

NOTE - La máscara 755 establece los permisos propietario, grupo, mundo [cualquiera] en rwxr-xr-x donde r = leer, w = escribir y x = ejecutar.

Dir.mkdir( "mynewdir", 755 )

Eliminar un directorio

El Dir.delete se puede utilizar para eliminar un directorio. Los Dir.unlink y Dir.rmdir realiza exactamente la misma función y se proporcionan por conveniencia.

Dir.delete("testdir")

Creación de archivos y directorios temporales

Los archivos temporales son aquellos que pueden crearse brevemente durante la ejecución de un programa, pero no son un almacén permanente de información.

Dir.tmpdir proporciona la ruta al directorio temporal en el sistema actual, aunque el método no está disponible de forma predeterminada. Para que Dir.tmpdir esté disponible, es necesario utilizar require 'tmpdir'.

Puede usar Dir.tmpdir con File.join para crear un archivo temporal independiente de la 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 crea un archivo temporal, escribe datos en él y lo elimina. La biblioteca estándar de Ruby también incluye una biblioteca llamada Tempfile que puede crear archivos temporales para usted:

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

Funciones integradas

Aquí están las funciones integradas de ruby ​​para procesar archivos y directorios:

  • Clase de archivo y métodos .

  • Dir Clase y métodos .