Inicio/Copia USB y disco portátil

Copia USB y disco portátil

Autor Azalea · Última prueba 2026-05-11

USB es un backend de primera clase, no un interruptor de usuario avanzado. El provider del motor es usb. Escritorio e iOS por defecto usan modo path. Android tiene que usar bridge porque OTG solo te entrega un URI content://; POSIX open() no funciona.

Qué hace el iPhone de verdad

iOS no listará volúmenes montados (FileManager.mountedVolumeURLs está vacío fuera de macOS). La app nunca muestra «SanDisk detectado». La vía es:

  1. Enchufa el disco hasta que aparezca en Archivos.
  2. Azalea → almacenamiento de copia → perfil USB nuevo.
  3. Elige una carpeta. La app guarda un marcador security-scoped, no una cadena de ruta cruda.
  4. Cada llamada al motor después corre dentro de withAccess. Usar el marcador fuera de ese ámbito se convierte en un error de permiso opaco de Rust.

El 21 feb 2026, iPhone 15 + SanDisk Extreme 1 TB: tras la primera elección, bloquear el teléfono hizo que el siguiente arranque informara el volumen ausente hasta un refresco manual. Eso no es relleno de copy — iOS no tiene una notificación de conexión a la que podamos suscribirnos.

Por qué Android es SAF

OpenDocumentTree, luego takePersistableUriPermission. Salta la llamada persist y la concesión muere al reiniciar. SafFileBridge no recorre DocumentFile.findFile (O(n) por nivel; decenas de miles de fotos se atascan). Prefiere construir el document id.

Tira del cable y obtienes DeviceDetached, no un fallo genérico de I/O. Disco lleno es OutOfSpace. La UI debería pausar, no pintar un elemento en rojo y seguir recorriendo.

Qué aterriza en el disco

<root>/.album/manifest.jsonl es append-only. Cabecera de versión en la línea uno, luego key lógica, ruta física, bytes, MD5, tombstones. Un segundo teléfono reclama la misma carpeta leyendo ese libro e invirtiendo los nombres escapados. .album/ nunca aparece en list.

exFAT no tiene xattr. Guardar MD5 como lo hacen los backends de nube lanzaría ENOTSUP en cada subida USB. Los checksums viven en el manifiesto en su lugar.

Cosas que no pasarán

  • No hay presign_put.
  • No formates APFS y esperes que Android lo escriba.
  • Dos discos llamados ambos Backup se distinguen por el UUID de volumeIdentity(), no por la etiqueta de carpeta.