Estoy buscando una mejor manera de detectar el espacio en disco disponible / libre en el dispositivo iPhone / iPad mediante programación.
Actualmente estoy usando NSFileManager para detectar el espacio en disco. El siguiente es el fragmento del código que hace el trabajo por mí:
-(unsigned)getFreeDiskspacePrivate {
NSDictionary *atDict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" error:NULL];
unsigned freeSpace = [[atDict objectForKey:NSFileSystemFreeSize] unsignedIntValue];
NSLog(@"%s - Free Diskspace: %u bytes - %u MiB", __PRETTY_FUNCTION__, freeSpace, (freeSpace/1024)/1024);
return freeSpace;
}
¿Estoy correcto con el fragmento anterior? ¿O hay alguna forma mejor de saber el espacio total disponible / libre en el disco?
Tengo que detectar el espacio libre total en disco, ya que debemos evitar que nuestra aplicación realice la sincronización en el escenario de poco espacio en disco.
Respuestas:
ACTUALIZACIÓN : Dado que ha pasado mucho tiempo después de esta respuesta y se han agregado nuevos métodos / API, verifique las respuestas actualizadas a continuación para Swift, etc. Como no los he usado yo mismo, no puedo responder por ellos.
Respuesta original : Encontré la siguiente solución funcionando para mí:
Me devuelve exactamente el tamaño que muestra iTunes cuando el dispositivo está conectado a la máquina.
fuente
NSUInteger
lugar de cosas comouint64_t
? Estamos escribiendo Obj-C, no C ++ o C. NSUInteger le dará un entero de 64 bits sin signo ahora, pero si las cosas cambian, imagino que Apple actualizará esa Macro (digamos 128 bits en algún momento, se vuelve real)Fuente revisada usando unsigned long long:
EDITAR: parece que alguien editó este código para usar 'uint64_t' en lugar de 'unsigned long long'. Si bien en el futuro previsible esto debería estar bien, no son lo mismo. 'uint64_t' es de 64 bits y siempre será eso. En 10 años, 'unsigned long long' podría ser 128. es un pequeño punto, pero por qué usé unsignedLongLong.
fuente
He escrito una clase para obtener memoria disponible / usada usando Swift. Demostración en: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 actualizado.
Manifestación
fuente
Si necesita una cadena formateada con tamaño, puede echar un vistazo a la buena biblioteca en GitHub :
fuente
No use 'sin firmar', solo son 32 bits que se desbordarán más de 4 GB, que es menos que el espacio libre típico de iPad / iPhone. Use unsigned long long (o uint64_t) y recupere el valor del NSNumber como un int de 64 bits también usando unsignedLongLongValue.
fuente
Si está buscando obtener el espacio libre restante usando Swift, es ligeramente diferente. Necesita usar los atributos deFileSystemForPath () en lugar de los atributosOfItemAtPath ():
Editar: Actualización de Swift 1.0
Edición 2: Actualización de seguridad, utilizando la respuesta de Martin R .
Edición 3: actualizado para Swift 2.0 (por dgellow )
fuente
Aquí está mi respuesta y por qué es mejor.
Respuesta (Swift):
Respuesta (Objetivo-C):
Por qué es mejor:
NSByteCountFormatter
, lo que significa que no hay cálculos manuales locos de bytes a gigabytes. ¡Apple hace esto por ti!NSByteCountFormatter
hace esto por usted. Por ejemplo, cuando el idioma del dispositivo está configurado en inglés, la cadena leerá 248.8 MB pero leerá 248,8 Mo cuando esté configurado en francés, etc. para otros idiomas.fuente
Aclaración importante (al menos para mí). Si conecto mi iPod a mi Mac, esta es la información que muestra la aplicación iTunes.
Cuando uso el código anterior:
The countStyle NSByteCountFormatterCountStyleFile muéstrame: 17,41 GB
CountStyle NSByteCountFormatterCountStyleBinary muéstrame: 16,22 GB
16,22 GB ( NSByteCountFormatterCountStyleBinary ) Es EXACTAMENTE el número que la aplicación iTunes me muestra cuando conecto mi iPod a mi Mac.
fuente
Actualice con una nueva API precisa para obtener el tamaño disponible en el disco disponible en iOS11. Aquí está la descripción de la nueva clave de recurso API:
Comparé los resultados de la clave " FileAttributeKey.systemFreeSize " y la clave " URLResourceKey.volumeAvailableCapacityForImportantUsageKey " y encontré que los resultados devueltos del formulario " volumeAvailableCapacityForImportantUsageKey " coinciden exactamente con el almacenamiento disponible que se muestra en la interfaz de usuario. Aquí está la implementación rápida:
fuente
volumeAvailableCapacityForOpportunisticUsageKey
.NSHomeDirectory()
oNSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
. ¿Hay alguna diferencia usando estos dos?Puedes encontrar otra solución usando Swift 4 y
extension
que te da una buena opción.Aquí está la
UIDevice
extensión.Y uso de la muestra:
fuente
!
en su lugar poner unguard
segurotypecasting
onil
comprobar.Para iOS> = 6.0 puede usar el nuevo
NSByteCountFormatter
. Este código obtiene el número de bytes libres restantes como una cadena formateada.fuente
El siguiente código es la implementación de la versión Swift 3.0 de la respuesta proporcionada previamente por ChrisJF:
fuente
para Swift como extensión UIDevice
Cómo utilizar:
La salida será:
fuente
Sé que esta publicación es un poco antigua, pero creo que esta respuesta puede ayudar a alguien. Si desea conocer el espacio de disco usado / libre / total en el dispositivo, puede usar Luminous . Está escrito en Swift. Solo tienes que llamar a:
o
fuente
Implementación rápida del código anterior: -
Llámalo desde cualquier otra clase.
Al probar el valor devuelto, es el mismo que muestran otras aplicaciones. Al menos en mi iPhone 6S +. Es solo la rápida implementación de la respuesta mostrada anteriormente. Y para mí la respuesta aceptada no funcionó.
fuente
Respuesta de ChrisJF en la versión 2.1 de Swift :
fuente
Si desea ahorrar tiempo, use la siguiente Biblioteca CocoaPod. No lo usé pero parece que debería funcionar.
https://cocoapods.org/pods/SystemServices
fuente
Extensión Swift 5 para
FileManager
el manejo adecuado de errores y sin conversiones automáticas de cadenas (convierta el recuento de bytes a cadenas como prefiera). También sigueFileManager
los nombres.Ejemplo de uso:
fuente