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