← Ruby EspañolChapter 10 of 13

Entrada/Salida de Archivos

## Objetivos de Aprendizaje - Leer de y escribir en archivos - Trabajar con rutas de archivos y directorios - Usar metodos de la clase File - Manejar excepciones relacionadas con archivos ## Lectura de Archivos ### Leer Archivo Completo ```ruby contenido = File.read("ejemplo.txt") puts contenido ``` ### Leer Linea por Linea ```ruby File.open("ejemplo.txt", "r") do |archivo| archivo.each_line do |linea| puts linea end end # O con bloque shorthand File.foreach("ejemplo.txt") { |linea| puts linea } ``` ### Leer con Codificacion ```ruby contenido = File.read("ejemplo.txt", encoding: "UTF-8") contenido = File.read("ejemplo.txt", encoding: "Windows-1252") ``` ## Escritura de Archivos ### Escribir en Archivo ```ruby File.write("salida.txt", "Hola, Mundo!") # Modo append File.write("salida.txt", "Mas contenido\n", mode: "a") ``` ### Abrir y Escribir ```ruby File.open("salida.txt", "w") do |archivo| archivo.puts "Linea 1" archivo.puts "Linea 2" archivo.write "Sin salto de linea" end ``` ## Modos de Archivo | Modo | Descripcion | |------|-------------| | `r` | Solo lectura (predeterminado) | | `w` | Solo escritura (trunca) | | `a` | Append (agregar al final) | | `r+` | Lectura y escritura | | `w+` | Lectura y escritura (trunca) | | `a+` | Lectura y append | ## Operaciones de Archivo ### Verificar Existencia de Archivo ```ruby File.exist?("ejemplo.txt") File.file?("ejemplo.txt") File.directory?("ruta") ``` ### Info de Archivo ```ruby File.size("ejemplo.txt") File.mtime("ejemplo.txt") # Tiempo de modificacion File.atime("ejemplo.txt") # Tiempo de acceso File.extname("archivo.txt") # ".txt" File.basename("/ruta/archivo.txt") # "archivo.txt" File.dirname("/ruta/archivo.txt") # "/ruta" ``` ### Copiar, Mover, Eliminar ```ruby FileUtils.cp("origen.txt", "destino.txt") FileUtils.mv("viejo.txt", "nuevo.txt") FileUtils.rm("archivo.txt") # O integrado File.copy("origen.txt", "destino.txt") File.delete("archivo.txt") ``` ## Directorios ### Leer Contenido de Directorio ```ruby Dir.foreach(".") do |entrada| puts entrada unless entrada.start_with?(".") end # Patron glob Dir.glob("*.rb") # Todos los archivos Ruby Dir.glob("**/*.rb") # Recursivo Dir.glob("{app,config}/*.rb") # Multiples patrones ``` ### Crear y Eliminar Directorios ```ruby Dir.mkdir("nuevo_directorio") Dir.rmdir("directorio_vacio") # Creacion recursiva require 'fileutils' FileUtils.mkdir_p("a/b/c/d") ``` ### Cambiar Directorio ```ruby Dir.chdir("/tmp") puts Dir.pwd # Directorio actual ``` ## Pathname ```ruby require 'pathname' ruta = Pathname.new("/home/usuario/docs/informe.pdf") ruta.basename # "informe.pdf" ruta.dirname # "/home/usuario/docs" ruta.extname # ".pdf" ruta.parent # "/home/usuario/docs" ruta.join("..", "backup", "informe.pdf") ruta.exist? ruta.directory? ruta.file? ``` ## Trabajando con CSV ```ruby require 'csv' # Lectura CSV.foreach("datos.csv") do |fila| puts fila.join(", ") end # Escritura CSV.open("salida.csv", "w") do |csv| csv << ["Nombre", "Edad"] csv << ["Alicia", 30] csv << ["Bob", 25] end # A array datos_csv = CSV.read("datos.csv") ``` ## Trabajando con JSON ```ruby require 'json' # Leer JSON json_string = File.read("datos.json") datos = JSON.parse(json_string) # Escribir JSON datos = { nombre: "Alicia", edad: 30 } File.write("datos.json", JSON.generate(datos)) # Impresion bonita File.write("datos.json", JSON.pretty_generate(datos)) ``` ## Trabajando con YAML ```ruby require 'yaml' # Leer YAML datos = YAML.load_file("config.yml") # Escribir YAML File.write("config.yml", YAML.dump(datos)) ``` ## Tempfile ```ruby require 'tempfile' archivo = Tempfile.new("miapp") archivo.write("Datos temporales") archivo.rewind puts archivo.read archivo.close archivo.unlink # Eliminar # Forma con bloque - limpia automaticamente Tempfile.create("miapp") do |f| f.write("Datos temporales") puts f.read end ``` ## Bloqueo de Archivos ```ruby File.open("compartido.txt", "w") do |f| f.flock(File::LOCK_EX) # Bloqueo exclusivo f.write("Datos") f.flock(File::LOCK_UN) # Desbloquear end # Bloqueo compartido para lectura File.open("compartido.txt", "r") do |f| f.flock(File::LOCK_SH) # Bloqueo compartido puts f.read end ``` ## Archivos Binarios ```ruby # Leer binario File.binread("imagen.png") # Escribir binario File.binwrite("copia.png", File.binread("original.png")) # Con modo File.open("imagen.png", "rb") do |f| datos = f.read end ``` ## Manejo de Errores con Archivos ```ruby begin File.open("ejemplo.txt", "r") do |archivo| contenido = archivo.read end rescue Errno::ENOENT puts "Archivo no encontrado" rescue Errno::EACCES puts "Permiso denegado" rescue => e puts "Error: #{e.message}" end ``` ## Resumen - `File.read`/`File.write` para operaciones simples - `File.open` con bloque asegura cierre propert - Modos de archivo: `r`, `w`, `a`, `r+`, `w+`, `a+` - Clase `Dir` para operaciones de directorios - `Pathname` para manipulacion de rutas - Librerias `CSV`, `JSON`, `YAML` para datos estructurados - `Tempfile` para archivos temporales - `FileUtils` para operaciones comunes de archivos - Manejar `Errno::ENOENT` para archivos faltantes

Comments

Comments powered by Giscus

To enable comments, add your Giscus embed code here.

Learn more about Giscus →