Introducción: Por qué es importante trabajar con el sistema de archivos en Swift
Cualquier aplicación en iOS o macOS tarde o temprano se enfrenta a la necesidad de guardar datos en el dispositivo del usuario. Ya sea almacenamiento en caché de imágenes, descarga de documentos o guardado de configuraciones, trabajar con el sistema de archivos en Swift es una habilidad fundamental para todo desarrollador. En este artículo, analizaremos en la práctica cómo usar FileManager, trabajar con directorios, leer y escribir archivos, así como gestionar sus atributos. Obtendrá ejemplos de código listos para usar que puede aplicar inmediatamente en su proyecto.
Herramientas principales: FileManager y URL
La clase central para trabajar con el sistema de archivos en Swift es FileManager. Proporciona una interfaz unificada para interactuar con el sistema de archivos tanto en iOS como en macOS. El segundo componente clave es URL, que se utiliza para especificar rutas a archivos y directorios.
Obtención de directorios estándar
Lo primero que debe saber es cómo obtener las rutas a los directorios del sistema: Documents, Library, Caches y Temporary. Así es como se hace:
import Foundation
let fileManager = FileManager.default
// Directorio Documents — para datos del usuarioguard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("No se pudo obtener el directorio Documents")}print("Documents: \\(documentsURL.path)")
// Directorio Caches — para datos temporales en cachélet cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!print("Caches: \\(cachesURL.path)")
// Directorio temporal — para archivos que se pueden eliminar en cualquier momentolet tempURL = fileManager.temporaryDirectoryprint("Temp: \\(tempURL.path)")Importante: En iOS, una aplicación solo puede escribir datos dentro de su propia zona de pruebas (sandbox). El acceso a archivos del sistema o archivos de otras aplicaciones está prohibido.
Creación, lectura y escritura de archivos
Ahora pasemos a las operaciones prácticas. Veamos cómo crear archivos, escribir datos en ellos y leerlos de vuelta.
Escritura de datos en un archivo
La forma más sencilla es usar el método write(to:) para cadenas o Data. Pero para mayor fiabilidad, siempre use el manejo de errores:
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!let fileURL = documentsURL.appendingPathComponent("example.txt")
let content = "¡Hola, Swift! Este es un archivo de prueba."
do { try content.write(to: fileURL, atomically: true, encoding: .utf8) print("Archivo creado exitosamente: \\(fileURL.lastPathComponent)")} catch { print("Error de escritura: \\(error.localizedDescription)")}Lectura de datos de un archivo
La lectura se realiza de manera similar, usando el constructor String(contentsOf:) o los métodos de Data:
do { let savedContent = try String(contentsOf: fileURL, encoding: .utf8) print("Contenido del archivo: \\(savedContent)")} catch { print("Error de lectura: \\(error.localizedDescription)")}Trabajo con datos binarios (imágenes, archivos)
Para archivos binarios, use el tipo Data:
// Escritura de datos binarioslet imageData = UIImage(named: "example.png")?.pngData()let imageURL = documentsURL.appendingPathComponent("image.png")
do { try imageData?.write(to: imageURL)} catch { print("Error al escribir la imagen: \\(error)")}
// Lectura de datos binariosif let loadedData = try? Data(contentsOf: imageURL) { let loadedImage = UIImage(data: loadedData) print("Imagen cargada: \\(loadedImage != nil)")}Gestión de directorios y archivos
No basta con solo escribir y leer. A menudo es necesario crear subdirectorios, mover, copiar o eliminar