Introducción
\nTrabajar con el sistema de archivos es una de las tareas clave al desarrollar aplicaciones para iOS y macOS. Independientemente de si estás escribiendo una aplicación para guardar datos de usuario, almacenar en caché imágenes o exportar documentos, comprender los fundamentos del trabajo con archivos en Swift es una habilidad obligatoria. En este artículo, analizaremos ejemplos prácticos de trabajo con el sistema de archivos: creación, lectura, escritura, eliminación de archivos y gestión de directorios.
\nApple proporciona una potente API FileManager que permite interactuar con el sistema de archivos tanto en iOS como en macOS. La veremos con ejemplos reales y código listo para usar.
1. Obtención de rutas a directorios del sistema
\nAntes de comenzar a trabajar con archivos, necesitas acceder a los directorios correctos. En iOS y macOS, cada aplicación funciona en una zona aislada (sandbox). Para almacenar datos, utiliza las siguientes rutas:
\n\nDirectorio Documents
\nSe utiliza para almacenar datos del usuario que deben conservarse durante las actualizaciones de la aplicación y las copias de seguridad.
\nimport Foundation\n\nfunc getDocumentsDirectory() -> URL {\n let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)\n return paths[0]\n}\n\n// Ejemplo de uso\nlet documentsURL = getDocumentsDirectory()\nprint("Ruta de Documents: \\(documentsURL.path)")\n\nDirectorio Caches
\nPara archivos temporales que se pueden recrear (por ejemplo, caché de imágenes).
\nfunc getCachesDirectory() -> URL {\n let paths = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)\n return paths[0]\n}\n\nDirectorio Library/Application Support
\nPara almacenar datos que no deben ser accesibles directamente por el usuario, pero que deben conservarse.
\nfunc getApplicationSupportDirectory() -> URL {\n let paths = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)\n let directory = paths[0]\n // Asegurémonos de que el directorio existe\n try? FileManager.default.createDirectory(at: directory, withIntermediateDirectories: true)\n return directory\n}\n\n2. Creación y escritura de archivos
\nAhora que sabemos dónde almacenar archivos, aprendamos a crearlos y escribir datos.
\n\nEscritura de datos de texto
\nLa forma más sencilla es usar el método write(to:) de un String o Data.
func writeTextFile() {\n let fileName = "example.txt"\n let documentsURL = getDocumentsDirectory()\n let fileURL = documentsURL.appendingPathComponent(fileName)\n \n let content = "¡Hola, Swift! Este es un archivo de prueba."\n \n do {\n try content.write(to: fileURL, atomically: true, encoding: .utf8)\n print("Archivo creado exitosamente: \\(fileURL.path)")\n } catch {\n print("Error al escribir el archivo: \\(error.localizedDescription)")\n }\n}\n\nEscritura de datos binarios (imágenes, JSON)
\nPara trabajar con datos binarios, usamos Data.
func writeJSONFile() {\n let fileName = "data.json"\n let documentsURL = getDocumentsDirectory()\n let fileURL = documentsURL.appendingPathComponent(fileName)\n \n let dictionary: [String: Any] = [\n "name": "Desarrollador Swift",\n "age": 30,\n "skills": ["iOS", "macOS", "SwiftUI"]\n ]\n \n do {\n let jsonData = try JSONSerialization.data(withJSONObject: dictionary, options: .prettyPrinted)\n try jsonData.write(to: fileURL, options: .atomic)\n print("Archivo JSON guardado")\n } catch {\n print("Error: \\(error)")\n }\n}\n\nCreación de directorios
\nA veces es necesario crear carpetas anidadas para organizar los archivos.
\nfunc createSubdirectories() {\n let documentsURL = getDocumentsDirectory()\n let subDirURL = documentsURL.appendingPathCo