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ódulo System.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

Módulo 3: Programación Funcional

Módulo 4: Estructuras de Datos Avanzadas

Módulo 5: Programación Orientada a Objetos en F#

Módulo 6: Programación Asíncrona y Paralela

Módulo 7: Acceso y Manipulación de Datos

Módulo 8: Pruebas y Depuración

Módulo 9: Temas Avanzados

Módulo 10: Aplicaciones Prácticas

© Copyright 2024. Todos los derechos reservados