FileManager en Swift
2 de abril de 2024
Como nos indica la documentación que nos proporciona Apple, FileManager representa una cómoda interfaz para acceder al contenido del sistema de archivos y el principal medio para interactuar con él 1.
Y es que con este objeto podemos realizar una gran multitud de tareas de gestión de archivos, entre las que destacan: acceso a directorios propios del sistema, creación y eliminación de directorios y archivos, reemplazamientos, movimientos, copias, comprobaciones de los permisos de archivos, etc.
En este artículo veremos:
- Creación de directorios.
- Enumerar contenido de un directorio.
- Mostrar contenido de un archivo = lectura.
- Comprobar la existencia de un archivo o directorio.
- Escritura en archivo.
Creación de directorios
func crearDirectorio( _ direccion: String, _ nombreCarpeta: String) { do { try fileManager.createDirectory( atPath: direccion + nombreCarpeta + "/", withIntermediateDirectories: true) } catch { print(error.localizedDescription) }}
Enumerar contenido de un directorio
func enumerarDirectorio(_ direccion: String) { do { let directorios: [String] = try fileManager.contentsOfDirectory(atPath: direccion) print(directorios) } catch { print(error.localizedDescription) }}
Mostrar contenido de un archivo = lectura
func contenidoArchivo(_ direccion: String) -> String { guard let data = try fileManager.contents(atPath: direccion), let contenido = String(data: data, encoding: .utf8) else { return "Error" // Lo lógico sería declarar un enum con los errores posibles y aquí lanzar su descripción } return contenido}
Comprobar la existencia de un archivo o directorio
func archivoExiste(_ direccion: String) -> Bool { let existe: Bool = fileManager.fileExists(atPath: direccion) return existe}
Escritura en archivo
func escrituraUnaLinea( _ direccion: String, _ contenido: String) { do { try contenido.write(toFile: direccion, atomically: false, encoding: .utf8) } catch { print("Error al realizar el proceso de escritura del archivo: \(error)") }}
Con este método estaríamos creando un archivo nuevo cada vez y escribiendo el contenido dado, por lo que no podríamos seguir escribiendo si volviéramos a llamarlo.
Para ello, para agregar información a un archivo, necesitamos la ayuda de otra clase que, aunque no está relacionada directamente con nuestro FileManager, es de obligada mención llegado a este punto. Hablamos de FileHandle 2, el cual se utiliza para acceder a datos asociados a ficheros, sockets, tuberías y dispositivos. En el caso de los ficheros, se puede leer, escribir y buscar dentro del fichero.
Por tanto, para agregar información a nuestro haríamos lo siguiente:
func agregarLinea( _ direccion: String, _ contenido: String) { if let fileHandle = FileHandle(forWritingAtPath: direccion) { // Mover el cursor al final del archivo fileHandle.seekToEndOfFile()
// Convertir el contenido a datos y escribirlo en el archivo if let data = contenido.data(using: .utf8) { fileHandle.write(data) print("Contenido agregado al archivo \(direccion)") } else { print("Error al convertir el contenido a datos.") }
// Cerrar el archivo después de escribir fileHandle.closeFile() } else { print("Error al abrir el archivo en modo de escritura.") }}
Conclusión
Aunque tenemos una infinidad de posibilidades con las que jugar con el objeto FileManager, por lo que os invito a profundizar en la documentación que señalo en la bibliografía; en mi caso lo empleo para construir scripts con Swift para automatización de tareas dentro de mi local o para persistir datos en pequeñas aplicaciones que construyo.