Je recherche un meilleur moyen de détecter par programmation l'espace disque disponible / libre sur l'appareil iPhone / iPad.
Actuellement, j'utilise NSFileManager pour détecter l'espace disque. Voici l'extrait de code qui fait le travail pour moi:
-(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;
}
Ai-je raison avec l'extrait ci-dessus? ou y a-t-il un meilleur moyen de connaître l'espace disque total disponible / libre.
Je dois détecter l'espace disque libre total, car nous devons empêcher notre application d'effectuer la synchronisation dans le scénario d'espace disque faible.
Réponses:
MISE À JOUR : Étant donné que beaucoup de temps s'est écoulé après cette réponse et que de nouvelles méthodes / API ont été ajoutées, veuillez vérifier les réponses mises à jour ci-dessous pour Swift, etc. Puisque je ne les ai pas utilisées moi-même, je ne peux pas en garantir.
Réponse originale : j'ai trouvé la solution suivante fonctionnant pour moi:
Cela me renvoie exactement la taille qu'iTunes affiche lorsque l'appareil est connecté à la machine.
la source
NSUInteger
place de trucs commeuint64_t
? Nous écrivons Obj-C, pas C ++ ou C. NSUInteger vous donnera un entier 64 bits non signé maintenant, mais si les choses changent, j'imagine qu'Apple mettra à jour cette macro (disons 128 bits à un moment donné, deviendra réelle)Source révisée utilisant unsigned long long:
EDIT: il semble que quelqu'un a édité ce code pour utiliser 'uint64_t' au lieu de 'unsigned long long'. Alors que dans un avenir prévisible cela devrait être très bien, ils ne sont pas les mêmes. 'uint64_t' est de 64 bits et le sera toujours. Dans 10 ans, «unsigned long long» pourrait être 128. c'est un petit point mais pourquoi j'ai utilisé unsignedLongLong.
la source
J'ai écrit une classe pour obtenir la mémoire disponible / utilisée en utilisant Swift. Démo sur: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 mis à jour.
Démo
la source
Si vous avez besoin d'une chaîne formatée avec une taille, vous pouvez jeter un œil à la belle bibliothèque sur GitHub :
la source
N'utilisez pas `` non signé '', ce ne sont que 32 bits qui déborderont au-delà de 4 Go, ce qui est inférieur à l'espace libre typique d'un iPad / iPhone. Utilisez unsigned long long (ou uint64_t) et récupérez la valeur du NSNumber sous la forme d'un entier 64 bits également à l'aide de unsignedLongLongValue.
la source
Si vous cherchez à obtenir l'espace libre restant en utilisant Swift, c'est légèrement différent. Vous devez utiliser attributesOfFileSystemForPath () au lieu d'attributsOfItemAtPath ():
Edit: Mise à jour pour Swift 1.0
Edit 2: Mise à jour pour la sécurité, en utilisant la réponse de Martin R .
Edit 3: mis à jour pour Swift 2.0 (par dgellow )
la source
Voici ma réponse et pourquoi c'est mieux.
Réponse (Swift):
Réponse (Objectif-C):
Pourquoi c'est mieux:
NSByteCountFormatter
, ce qui signifie pas de calculs manuels fous d'octets en gigaoctets. Apple fait cela pour vous!NSByteCountFormatter
fait cela pour vous. Par exemple, lorsque la langue de l'appareil est réglée sur l'anglais, la chaîne lira 248,8 Mo mais lira 248,8 Mo lorsqu'elle est réglée sur le français, et cetera pour les autres langues.la source
Précision importante (du moins pour moi). Si je connecte mon iPod à mon Mac, ce sont les informations affichées par l'application iTunes.
Lorsque j'utilise le code ci-dessus:
Le countStyle NSByteCountFormatterCountStyleFile montre-moi: 17,41 Go
Le countStyle NSByteCountFormatterCountStyleBinary montre-moi: 16,22 Go
16,22 Go ( NSByteCountFormatterCountStyleBinary ) C'est EXACTEMENT le numéro que l'application iTunes me montre lorsque je connecte mon iPod à mon Mac.
la source
Mettez à jour avec une nouvelle API précise pour obtenir la taille disponible sur le disque disponible dans iOS11. Voici la description de la nouvelle clé de ressource API:
J'ai comparé les résultats de la clé " FileAttributeKey.systemFreeSize " et de la clé " URLResourceKey.volumeAvailableCapacityForImportantUsageKey " et j'ai trouvé les résultats renvoyés sous la forme " volumeAvailableCapacityForImportantUsageKey " correspondant exactement au stockage disponible affiché sur l'interface utilisateur. Voici la mise en œuvre rapide:
la source
volumeAvailableCapacityForOpportunisticUsageKey
.NSHomeDirectory()
ouNSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
. Y a-t-il une différence en utilisant ces deux?Vous pouvez trouver une autre solution en utilisant Swift 4 et
extension
qui vous donne une bonne option.Voici l'
UIDevice
extension.Et exemple d'utilisation:
la source
!
place mettre unguard
en sécuritétypecasting
ounil
vérifier.Pour iOS> = 6.0, vous pouvez utiliser le nouveau
NSByteCountFormatter
. Ce code obtient le nombre d'octets libres restants sous forme de chaîne formatée.la source
Le code suivant est l'implémentation de la version Swift 3.0 de la réponse précédemment fournie par ChrisJF:
la source
pour Swift comme extension UIDevice
Comment utiliser:
La sortie sera:
la source
Je sais que cet article est un peu vieux, mais je pense que cette réponse peut aider quelqu'un. Si vous voulez connaître l'espace disque utilisé / libre / total sur l'appareil, vous pouvez utiliser Luminous . C'est écrit en Swift. Vous n'avez qu'à appeler:
ou
la source
Implémentation rapide du code ci-dessus: -
Appelez-le de n'importe quelle autre classe.
Lors du test de la valeur renvoyée, elle est identique à celle affichée par d'autres applications. Au moins dans mon iPhone 6S +. C'est juste la mise en œuvre rapide de la réponse ci-dessus. Et pour moi, la réponse acceptée n'a pas fonctionné.
la source
Réponse de ChrisJF dans la version Swift 2.1 :
la source
Si vous souhaitez gagner du temps, utilisez la bibliothèque CocoaPod suivante. Je ne l'ai pas utilisé mais il semble que cela devrait fonctionner.
https://cocoapods.org/pods/SystemServices
la source
Extension Swift 5 pour
FileManager
une gestion correcte des erreurs et aucune conversion automatique de chaîne (convertissez le nombre d'octets en chaîne comme vous préférez). Suit égalementFileManager
la dénomination.Exemple d'utilisation:
la source