En este módulo, aprenderemos cómo trabajar con archivos en F#. La entrada/salida de archivos (I/O) es una parte fundamental de muchas aplicaciones, ya que permite leer datos de archivos y escribir datos en ellos. F# proporciona varias formas de manejar archivos de manera eficiente y segura.
Contenido
Lectura de Archivos
Lectura de Archivos de Texto
Para leer archivos de texto en F#, podemos utilizar las funciones proporcionadas por el módulo System.IO
. Aquí hay un ejemplo básico de cómo leer un archivo de texto línea por línea:
open System.IO let readLines (filePath: string) = File.ReadAllLines(filePath) |> Array.iter (fun line -> printfn "%s" line) // Uso de la función let filePath = "ruta/al/archivo.txt" readLines filePath
Explicación del Código
open System.IO
: Importa el móduloSystem.IO
que contiene funciones para trabajar con archivos.File.ReadAllLines(filePath)
: Lee todas las líneas del archivo especificado y las devuelve como un array de cadenas.Array.iter (fun line -> printfn "%s" line)
: Itera sobre cada línea del array y la imprime en la consola.
Lectura de Archivos Binarios
Para leer archivos binarios, podemos utilizar FileStream
y BinaryReader
:
open System.IO let readBinaryFile (filePath: string) = use fs = new FileStream(filePath, FileMode.Open, FileAccess.Read) use br = new BinaryReader(fs) let buffer = Array.zeroCreate<byte> (int fs.Length) br.Read(buffer, 0, buffer.Length) |> ignore buffer // Uso de la función let filePath = "ruta/al/archivo.bin" let data = readBinaryFile filePath printfn "Datos leídos: %A" data
Explicación del Código
use fs = new FileStream(filePath, FileMode.Open, FileAccess.Read)
: Abre un flujo de archivo para lectura.use br = new BinaryReader(fs)
: Crea un lector binario para el flujo de archivo.Array.zeroCreate<byte> (int fs.Length)
: Crea un array de bytes del tamaño del archivo.br.Read(buffer, 0, buffer.Length)
: Lee los datos del archivo en el buffer.
Escritura de Archivos
Escritura de Archivos de Texto
Para escribir en archivos de texto, podemos utilizar File.WriteAllLines
o File.AppendAllLines
:
open System.IO let writeLines (filePath: string) (lines: string[]) = File.WriteAllLines(filePath, lines) // Uso de la función let filePath = "ruta/al/archivo.txt" let lines = [| "Primera línea"; "Segunda línea"; "Tercera línea" |] writeLines filePath lines
Explicación del Código
File.WriteAllLines(filePath, lines)
: Escribe todas las líneas en el archivo especificado. Si el archivo ya existe, se sobrescribirá.
Escritura de Archivos Binarios
Para escribir archivos binarios, podemos utilizar FileStream
y BinaryWriter
:
open System.IO let writeBinaryFile (filePath: string) (data: byte[]) = use fs = new FileStream(filePath, FileMode.Create, FileAccess.Write) use bw = new BinaryWriter(fs) bw.Write(data) // Uso de la función let filePath = "ruta/al/archivo.bin" let data = [| 0uy; 1uy; 2uy; 3uy; 4uy |] writeBinaryFile filePath data
Explicación del Código
use fs = new FileStream(filePath, FileMode.Create, FileAccess.Write)
: Abre un flujo de archivo para escritura.use bw = new BinaryWriter(fs)
: Crea un escritor binario para el flujo de archivo.bw.Write(data)
: Escribe los datos en el archivo.
Manipulación de Archivos
Comprobación de Existencia de Archivos
Podemos comprobar si un archivo existe utilizando File.Exists
:
open System.IO let fileExists (filePath: string) = File.Exists(filePath) // Uso de la función let filePath = "ruta/al/archivo.txt" if fileExists filePath then printfn "El archivo existe." else printfn "El archivo no existe."
Eliminación de Archivos
Para eliminar un archivo, utilizamos File.Delete
:
open System.IO let deleteFile (filePath: string) = if File.Exists(filePath) then File.Delete(filePath) printfn "Archivo eliminado." else printfn "El archivo no existe." // Uso de la función let filePath = "ruta/al/archivo.txt" deleteFile filePath
Ejercicios Prácticos
Ejercicio 1: Leer y Contar Líneas
Escribe una función que lea un archivo de texto y devuelva el número de líneas que contiene.
open System.IO let countLines (filePath: string) = File.ReadAllLines(filePath).Length // Uso de la función let filePath = "ruta/al/archivo.txt" let lineCount = countLines filePath printfn "El archivo tiene %d líneas." lineCount
Ejercicio 2: Copiar Archivo
Escribe una función que copie el contenido de un archivo a otro archivo.
open System.IO let copyFile (sourcePath: string) (destinationPath: string) = File.Copy(sourcePath, destinationPath, true) // Uso de la función let sourcePath = "ruta/al/archivo_origen.txt" let destinationPath = "ruta/al/archivo_destino.txt" copyFile sourcePath destinationPath printfn "Archivo copiado."
Conclusión
En esta sección, hemos aprendido cómo manejar la entrada y salida de archivos en F#. Hemos cubierto la lectura y escritura de archivos de texto y binarios, así como la manipulación básica de archivos. Estos conceptos son fundamentales para cualquier aplicación que necesite interactuar con el sistema de archivos.
En el próximo módulo, exploraremos cómo trabajar con JSON en F#, lo que nos permitirá manejar datos estructurados de manera eficiente.
Curso de Programación en F#
Módulo 1: Introducción a F#
Módulo 2: Conceptos Básicos
- Tipos de Datos y Variables
- Funciones e Inmutabilidad
- Coincidencia de Patrones
- Colecciones: Listas, Arreglos y Secuencias
Módulo 3: Programación Funcional
- Funciones de Orden Superior
- Recursión
- Encadenamiento y Composición
- Aplicación Parcial y Currificación
Módulo 4: Estructuras de Datos Avanzadas
Módulo 5: Programación Orientada a Objetos en F#
- Clases y Objetos
- Herencia e Interfaces
- Mezclando Programación Funcional y Orientada a Objetos
- Módulos y Espacios de Nombres
Módulo 6: Programación Asíncrona y Paralela
- Flujos de Trabajo Asíncronos
- Biblioteca de Tareas Paralelas
- MailboxProcessor y Agentes
- Patrones de Concurrencia
Módulo 7: Acceso y Manipulación de Datos
Módulo 8: Pruebas y Depuración
- Pruebas Unitarias con NUnit
- Pruebas Basadas en Propiedades con FsCheck
- Técnicas de Depuración
- Perfilado de Rendimiento