Introducción al trabajo con el sistema de archivos en Swift
El desarrollo para iOS y macOS a menudo requiere interactuar con el sistema de archivos del dispositivo. Ya sea guardar datos de usuario, almacenar en caché imágenes o exportar documentos, saber trabajar con archivos y carpetas es una habilidad obligatoria para cualquier desarrollador Swift. En este artículo, analizaremos en detalle cómo usar FileManager, URL y Data para realizar todas las operaciones básicas con el sistema de archivos.
Veremos la creación, lectura, escritura y eliminación de archivos, así como la navegación por directorios. Todos los ejemplos de código están escritos en Swift 5 y son adecuados tanto para proyectos iOS como macOS.
Componentes principales: FileManager y URL
En Swift, la clase central para trabajar con el sistema de archivos es FileManager. Proporciona métodos para gestionar archivos, directorios y sus atributos. Para especificar rutas se utiliza la estructura URL, que es una alternativa más segura y moderna a las cadenas de texto.
Obtención de directorios estándar
Lo primero que hay que saber es cómo obtener las rutas a los directorios estándar del sistema. Para iOS, estos son normalmente Documents, Library/Caches y tmp.
import Foundation
let fileManager = FileManager.default
// Directorio Documentsguard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("No se pudo obtener el directorio Documents")}print("Documents: \\(documentsURL.path)")
// Directorio Cachesguard let cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first else { fatalError("No se pudo obtener el directorio Caches")}print("Caches: \\(cachesURL.path)")
// Directorio temporallet tempURL = fileManager.temporaryDirectoryprint("Temp: \\(tempURL.path)")Creación y escritura de archivos
La creación de un archivo en Swift es una combinación de crear una ruta y escribir datos. Veamos dos enfoques principales.
Escritura de datos de texto
func createTextFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("example.txt") let content = "¡Hola, mundo! Este es un archivo de prueba." do { try content.write(to: fileURL, atomically: true, encoding: .utf8) print("Archivo creado exitosamente en la ruta: \\(fileURL.path)") } catch { print("Error al escribir el archivo: \\(error.localizedDescription)") }}Escritura de datos binarios (imágenes, archivos comprimidos)
func createBinaryFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("data.bin") let data = Data([0x48, 0x65, 0x6C, 0x6C, 0x6F]) // "Hello" en hex do { try data.write(to: fileURL, options: .atomic) print("Archivo binario creado") } catch { print("Error: \\(error)") }}Creación de directorios
func createDirectory() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let newDirURL = documentsURL.appendingPathComponent("MyFolder") do { try fileManager.createDirectory(at: newDirURL, withIntermediateDirectories: true, attributes: nil) print("Directorio creado: \\(newDirURL.path)") } catch { print("Error al crear el directorio: \\(error)") }}Lectura y verificación de archivos
Una vez que los archivos están creados, es necesario saber leerlos y verificar su existencia.
Verificación de existencia de un archivo
func fileExists(at url: URL) -> Bool { return fileMan