Estou procurando uma maneira melhor de detectar o espaço em disco disponível / livre no dispositivo iPhone / iPad programaticamente.
Atualmente, estou usando o NSFileManager para detectar o espaço em disco. A seguir está o trecho de código que faz o trabalho para mim:
-(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;
}
Estou correto com o trecho acima? ou existe alguma maneira melhor de conhecer o espaço total em disco disponível / livre.
Tenho que detectar o total de espaço livre em disco, pois precisamos impedir que nosso aplicativo execute sincronização no cenário de pouco espaço em disco.
Respostas:
ATUALIZAÇÃO : Como se passou muito tempo após esta resposta e novos métodos / APIs foram adicionados, verifique as respostas atualizadas abaixo para o Swift etc; Como eu não os usei, não posso atestá-los.
Resposta original : Encontrei a seguinte solução trabalhando para mim:
Ele me retorna exatamente o tamanho que o iTunes exibe quando o dispositivo está conectado à máquina.
fonte
NSUInteger
vez de coisas comouint64_t
? Estamos escrevendo Obj-C, não C ++ ou C. O NSUInteger fornecerá um número inteiro de 64 bits sem sinal agora, mas se as coisas mudarem, imagino que a Apple atualize essa macro (digamos que 128 bits em algum momento se torne real)Origem revisada usando não assinado por muito tempo:
EDIT: parece que alguém editou este código para usar 'uint64_t' em vez de 'unsigned long long'. Enquanto no futuro previsível, isso deve ser bom, eles não são os mesmos. 'uint64_t' é de 64 bits e sempre será isso. Em 10 anos, 'longo prazo' pode ser 128. é um pequeno ponto, mas por que eu usei unsignedLongLong.
fonte
Eu escrevi uma classe para obter memória disponível / usada usando o Swift. Demonstração em: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 atualizado.
Demo
fonte
Se você precisar de uma sequência de caracteres formatada com tamanho, consulte a boa biblioteca no GitHub :
fonte
Não use 'não assinado', são apenas 32 bits que ultrapassarão os 4 GB, menos do que o espaço livre típico do iPad / iPhone. Use não assinado por muito tempo (ou uint64_t) e recupere o valor do NSNumber como um int de 64 bits também usando unsignedLongLongValue.
fonte
Se você deseja obter o espaço livre restante usando o Swift, é um pouco diferente. Você precisa usar attributeOfFileSystemForPath () em vez de attributeOfItemAtPath ():
Edit: Atualizado para Swift 1.0
Edit 2: Atualizado para a segurança, usando a resposta de Martin R .
Edit 3: Updated for Swift 2.0 (por dgellow )
fonte
Aqui está a minha resposta e por que é melhor.
Resposta (rápida):
Resposta (Objetivo-C):
Por que é melhor:
NSByteCountFormatter
, o que significa que não há cálculos manuais malucos, de bytes a gigabytes. A Apple faz isso por você!NSByteCountFormatter
faz isso por você. Por exemplo, quando o idioma do dispositivo estiver definido como inglês, a string lerá 248,8 MB, mas lerá 248,8 Mo quando definida como francês, etc. para outros idiomas.fonte
Esclarecimentos importantes (pelo menos para mim). Se eu conectar meu iPod ao meu Mac, essas são as informações exibidas pelo iTunes App.
Quando eu uso o código acima:
O countStyle NSByteCountFormatterCountStyleFile mostra-me: 17,41 GB
O countStyle NSByteCountFormatterCountStyleBinary me mostra: 16,22 GB
16,22 GB ( NSByteCountFormatterCountStyleBinary ) É EXATAMENTE o número que o iTunes App me mostra quando conecto meu iPod ao Mac.
fonte
Atualize com uma nova API precisa para obter o tamanho disponível no disco disponível no iOS11. Aqui está a descrição para a nova chave de recurso da API:
Cruzei os resultados da chave " FileAttributeKey.systemFreeSize " e da chave " URLResourceKey.volumeAvailableCapacityForImportantUsageKey " e encontrei os resultados retornados no formulário " volumeAvailableCapacityForImportantUsageKey " exatamente corresponde ao armazenamento disponível mostrado na interface do usuário. Aqui está a rápida implementação:
fonte
volumeAvailableCapacityForOpportunisticUsageKey
.NSHomeDirectory()
ouNSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
. Existe alguma diferença usando esses dois?Você pode encontrar outra solução usando o Swift 4 e
extension
oferecendo uma boa opção.Aqui está a
UIDevice
extensão.E uso da amostra:
fonte
!
vez disso, coloque umguard
no cofretypecasting
ounil
verifique.Para iOS> = 6.0, você pode usar o novo
NSByteCountFormatter
. Esse código obtém o número de bytes livres restantes como uma seqüência de caracteres formatada.fonte
O código a seguir é a implementação da versão Swift 3.0 da resposta fornecida anteriormente por ChrisJF:
fonte
para Swift como extensão UIDevice
Como usar:
A saída será:
fonte
Sei que este post é um pouco antigo, mas acho que essa resposta pode ajudar alguém. Se você quiser conhecer o espaço em disco usado / livre / total no dispositivo, use o Luminous . Está escrito em Swift. Você só precisa ligar para:
ou
fonte
Implementação rápida do código acima: -
Ligue de qualquer outra classe.
Ao testar o valor retornado, é o mesmo mostrado por outros aplicativos. Pelo menos no meu iPhone 6S +. É apenas a rápida implementação da resposta mostrada acima. E para mim a resposta aceita não funcionou.
fonte
Resposta do ChrisJF na versão Swift 2.1 :
fonte
Se você deseja economizar tempo, use a seguinte Biblioteca CocoaPod. Eu não o usei, mas parece que deveria funcionar.
https://cocoapods.org/pods/SystemServices
fonte
Extensão Swift 5 para
FileManager
tratamento de erros adequado e sem conversões automáticas de string (converta a contagem de bytes em string conforme sua preferência). Também segueFileManager
a nomeação.Exemplo de uso:
fonte