FileManager — qué es, trabajo con el sistema de archivos de iOS

Autor: IT Sectr Publicado: 2026-07-09 Tiempo de lectura: 9 min

FileManager es una clase del framework Foundation que proporciona una interfaz para trabajar con el sistema de archivos en iOS, macOS y otras plataformas Apple. Permite crear, leer, mover y eliminar archivos y directorios, así como gestionar metadatos y permisos de acceso. En iOS, todas las operaciones de FileManager están limitadas por el Sandbox de la aplicación. Según la Documentación para Desarrolladores de Apple (2026), FileManager es seguro para subprocesos y puede usarse desde hilos en segundo plano, pero todas las operaciones del sistema de archivos deben realizarse teniendo en cuenta el sandbox y los permisos de acceso de Security-Scoped Bookmarks.

Puntos Clave

  • FileManager es la clase principal de Foundation para operaciones del sistema de archivos: leer, escribir, mover, eliminar archivos.
  • Sandbox restringe el acceso de FileManager solo a los directorios de la aplicación: Documents, Library, tmp y App Group.
  • API basada en URL (fileManager.urls) es preferible a la basada en String (NSHomeDirectory) para aplicaciones modernas.
  • FileManagerDelegate permite rastrear y controlar operaciones de archivos mediante shouldMoveItemAt y shouldRemoveItemAt.
  • iCloud Drive está disponible a través de FileManager cuando ubiquityContainer está habilitado y los entitlements correspondientes están configurados.

Qué es FileManager

FileManager es una clase singleton del framework Foundation que proporciona una API unificada para interactuar con el sistema de archivos en todas las plataformas Apple. Está disponible a través de FileManager.default o creando una instancia con un delegado personalizado.

Las principales capacidades de la clase incluyen: verificar la existencia de archivos (fileExists), crear directorios (createDirectory), copiar y mover (copyItem, moveItem), eliminar (removeItem), obtener atributos (attributesOfItem) y contenidos de directorios (contentsOfDirectory). FileManager está estrechamente relacionado con NSData, String y JSONEncoder/Decoder para la serialización de datos.

FileManager es seguro para subprocesos: Apple garantiza llamadas seguras a métodos desde diferentes hilos. Sin embargo, las operaciones del sistema de archivos pueden ser lentas en archivos grandes, por lo que Apple recomienda realizarlas en una cola en segundo plano (DispatchQueue.global) y llamar a los métodos de FileManagerDelegate para informar el progreso.

swift
let fileManager = FileManager.default
let documentsURL = fileManager.urls(
    for: .documentDirectory,
    in: .userDomainMask
).first!

let fileURL = documentsURL.appendingPathComponent("data.plist")

if fileManager.fileExists(atPath: fileURL.path) {
    print("File exists at \(fileURL.path)")
}

Principales directorios de aplicaciones iOS

Cada aplicación iOS tiene tres directorios principales accesibles a través de FileManager dentro del Sandbox: Documents, Library y tmp. Cada uno tiene su propio propósito y reglas de copia de seguridad que es fundamental cumplir para pasar la revisión de App Store.

Documents — para datos de usuario que deben conservarse entre inicios y respaldarse en iCloud. Library — para archivos de la aplicación: cachés (Caches), configuraciones (Preferences), bases de datos (Application Support). tmp — para archivos temporales que el sistema puede eliminar en cualquier momento entre los inicios de la aplicación.

DirectorioURL de FileManagerCopia de seguridadUso
Documents.documentDirectoryDatos de usuario, archivos, exportación
Library/Caches.cachesDirectoryNoCachés de imágenes, datos temporales
Library/Preferences.libraryDirectory + "Preferences"UserDefaults, configuraciones de la aplicación
Library/Application Support.applicationSupportDirectoryBases de datos, CoreData, Realm
tmp.tmpDirectory (NSTemporaryDirectory)NoArchivos temporales de sesión

Regla de Apple: si un archivo se puede recuperar de internet o recrear — debe almacenarse en Caches (sin copia de seguridad). Si un archivo contiene datos de usuario — Documents (con copia de seguridad). La colocación incorrecta de archivos es una de las razones comunes de rechazo de aplicaciones, ya que Apple verifica el cumplimiento de las Directrices de Almacenamiento y Copia de Seguridad de iCloud.

Lectura y escritura de archivos

FileManager en sí mismo no proporciona métodos para leer el contenido de los archivos — para eso use NSData(contentsOf), String(contentsOf) o los métodos de FileHandle. FileManager es responsable de gestionar archivos: verificar existencia, mover, copiar, eliminar.

Para escribir datos use el método createFile(atPath:contents:attributes:) o APIs de alto nivel — data.write(to:), JSONEncoder.encode y PropertyListEncoder. FileManager también proporciona FileHandle para lectura y escritura en streaming de archivos grandes, que no carga todo el archivo en memoria.

swift
struct UserSettings: Codable {
    let username: String
    let isDarkMode: Bool
    let fontSize: Int
}

let settings = UserSettings(
    username: "developer",
    isDarkMode: true,
    fontSize: 16
)

// Write JSON to Documents
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(settings)
let url = documentsURL.appendingPathComponent("settings.json")
try data.write(to: url, options: .atomic)

// Read JSON
let loadedData = try Data(contentsOf: url)
let loadedSettings = try JSONDecoder()
    .decode(UserSettings.self, from: loadedData)

Al escribir, use options: .atomic — esto garantiza que el archivo no se corrompa si falla la escritura: los datos se guardan primero en un archivo temporal, luego se mueven atómicamente a la ruta de destino. Para leer archivos grandes, use FileHandle con .readingMode y lea datos en fragmentos, controlando el consumo de memoria.

Gestión de directorios

FileManager proporciona métodos para la gestión completa de directorios: createDirectory (creando todas las carpetas intermedias mediante withIntermediateDirectories), contentsOfDirectory (obtener lista de archivos), enumeratorAt (recorrido recursivo) y subpathsOfDirectory (todas las rutas dentro de un directorio).

El método enumeratorAt devuelve un DirectoryEnumerator, que permite recorrer eficientemente directorios grandes sin cargar todo el contenido en memoria. Admite filtrado mediante skipDescendants y proporciona atributos de cada elemento sin una consulta adicional al sistema de archivos.

swift
// Recursive directory traversal
if let enumerator = fileManager.enumerator(
    at: documentsURL,
    includingPropertiesForKeys: [.fileSizeKey, .isDirectoryKey]
) {
    for case let fileURL as URL in enumerator {
        let attrs = try fileURL.resourceValues(
            for: [.fileSizeKey, .isDirectoryKey]
        )
        if attrs.isDirectory == false {
            let size = attrs.fileSize ?? 0
            print("File: \(fileURL.lastPathComponent), Size: \(size) bytes")
        }
    }
}

Para eliminar un directorio use removeItem(at:). Advertencia: eliminar un directorio en iOS es irreversible — los archivos no van a la papelera como en macOS. Antes de eliminar, asegúrese de que ya no necesita los archivos de ese directorio, y realice la operación en un hilo en segundo plano, ya que eliminar muchos archivos puede bloquear la interfaz de usuario.

FileManager e iCloud

FileManager se integra con iCloud Drive a través del método URLForUbiquityContainerIdentifier, que devuelve la URL del directorio de iCloud para la aplicación. Esto requiere habilitar la capacidad de iCloud en el proyecto y agregar el entitlement correspondiente.

Los archivos de iCloud se sincronizan automáticamente, pero FileManager proporciona métodos para el control manual: startDownloadingUbiquitousItem fuerza la descarga, evictUbiquitousItem elimina la copia local y urlOfItem(at:) devuelve la URL local para un archivo de iCloud. NSMetadataQuery se usa para buscar archivos en iCloud.

Limitación crítica: iCloud Drive no es compatible con archivos en el directorio Documents — solo para archivos en ubiquityContainer. No intente sincronizar Documents a través de iCloud; para eso use NSUbiquitousKeyValueStore para pequeñas cantidades de datos o Core Data con CloudKit para estructuras complejas.

Rendimiento de FileManager

Las operaciones con FileManager pueden ser costosas, especialmente en dispositivos con memoria flash lenta. Las principales recomendaciones de Apple incluyen realizar todas las operaciones de archivos en colas en segundo plano, minimizar la cantidad de llamadas a fileExistsAtPath y almacenar en caché los resultados.

El método fileExists realiza una llamada al sistema stat(), que es relativamente lenta. Si verifica la existencia de un archivo antes de leerlo, es mejor simplemente intentar leerlo y manejar el error — esto realiza el mismo stat pero evita una doble llamada al sistema. Para comprobaciones masivas, use enumeratorAt con resourceValues.

Para optimizar el trabajo con grandes volúmenes de datos:

  • Use FileHandle para procesamiento en streaming de archivos grandes
  • Almacene en caché los resultados de fileManager.urls para directorios de uso frecuente
  • Realice operaciones por lotes en una cola granulada, evitando bloquear el hilo principal
  • Use CoordinatedFileManager para acceso seguro desde múltiples hilos

Apple Instruments proporciona la plantilla File Activity para perfilar operaciones de archivos. Úsela para identificar cuellos de botella — por ejemplo, llamadas frecuentes a fileExists en un bucle u operaciones de escritura en el hilo principal. Los problemas de rendimiento más comunes están relacionados con la escritura síncrona de archivos grandes cuando la aplicación se suspende.

Preguntas Frecuentes

Qué es FileManager en iOS?

FileManager es una clase del framework Foundation para trabajar con el sistema de archivos de Apple. Proporciona una API para crear, leer, mover y eliminar archivos y directorios. En iOS, su funcionamiento está limitado al Sandbox de la aplicación, excepto para Security-Scoped Bookmarks.

Qué directorios están disponibles a través de FileManager en iOS?

Documents — datos de usuario con copia de seguridad en iCloud. Library/Caches — cachés sin copia de seguridad. Library/Application Support — bases de datos. tmp — archivos temporales. App Group Container — para datos compartidos entre aplicaciones del mismo grupo.

Cómo obtener la ruta a Documents a través de FileManager?

Llame a FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first. El método devuelve una URL con la ruta absoluta al directorio Documents dentro del Sandbox de la aplicación actual. Use fileExists(atPath:) para verificar la existencia.

Se puede acceder a archivos de otras aplicaciones a través de FileManager?

No, el Sandbox de iOS impide el acceso al sistema de archivos de otras aplicaciones. Excepciones: App Groups (directorio compartido para aplicaciones del mismo desarrollador) y Security-Scoped Bookmarks (acceso a archivos a través de UIDocumentPicker e iCloud Drive).

Cómo escribir archivos de forma segura a través de FileManager?

Use la opción .atomic al escribir — los datos se guardan primero en un archivo temporal, luego se mueven atómicamente a la ruta de destino. Esto evita la corrupción del archivo si falla la escritura. Para datos grandes, use FileHandle con escritura fragmentada de 1-2 MB.

Resumen

  • FileManager es la clase central de Foundation para todas las operaciones del sistema de archivos en iOS: desde verificación de existencia hasta recorrido recursivo de directorios.
  • Documents, Library, tmp — los tres directorios principales de la aplicación con diferentes reglas de copia de seguridad y ciclos de vida.
  • API basada en URL es preferible a las rutas basadas en String para compatibilidad con Sandbox y Security-Scoped Bookmarks.
  • FileHandle y el procesamiento en streaming son la única forma de trabajar con archivos grandes sin desbordar la memoria.
  • FileManagerDelegate permite controlar operaciones de movimiento, copia y eliminación a través de métodos should-.
  • Integración con iCloud está disponible a través de ubiquityContainer y NSMetadataQuery para trabajar con archivos en la nube.
  • Rendimiento de las operaciones de archivos es crítico — realícelas en colas en segundo plano y minimice las llamadas a fileExists.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también