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 →