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:

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

Bibliografía

Footnotes

  1. FileManager en Developer Apple Web

  2. FileHandle en Developer Apple Web