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 él1.


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:

  1. Creación de directorios.

  2. Enumerar contenido de un directorio.

  3. Mostrar contenido de un archivo = lectura.

  4. Comprobar la existencia de un archivo o directorio.

  5. 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 FileHandle2, 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 para seguir desarrollándome en mis conocimientos y poseer mayor soltura programática.


Bibliografía

  1. FileManager en Developer Apple Web

  2. FileHandle en Developer Apple Web