Я ищу лучший способ для определения доступного / свободного дискового пространства на устройстве iPhone / iPad.
В настоящее время я использую NSFileManager для обнаружения дискового пространства. Ниже приведен фрагмент кода, который выполняет эту работу за меня:
-(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;
}
Я прав с приведенным выше фрагментом? или есть ли лучший способ узнать общее доступное / свободное дисковое пространство.
Я должен определить общее свободное место на диске, так как мы должны запретить нашему приложению выполнять синхронизацию в сценарии с нехваткой места на диске.
Ответы:
ОБНОВЛЕНИЕ : так как после этого ответа прошло много времени и были добавлены новые методы / API, пожалуйста, проверьте обновленные ответы ниже для Swift и т. Д .; Поскольку я сам ими не пользовался, я не могу за них поручиться.
Оригинальный ответ : я нашел следующее решение, работающее на меня:
Он возвращает мне именно тот размер, который отображает iTunes, когда устройство подключено к машине.
источник
NSUInteger
вместо таких вещей, какuint64_t
? Мы пишем Obj-C, а не C ++ или C. NSUInteger теперь выдаст вам 64-разрядное целое число без знака, но если что-то изменится, я думаю, что Apple обновит этот макрос (скажем, 128-битный в какой-то момент станет реальностью)Пересмотренный источник с использованием unsigned long long:
РЕДАКТИРОВАТЬ: кажется, кто-то отредактировал этот код, чтобы использовать «uint64_t» вместо «unsigned long long». Хотя в обозримом будущем это должно быть просто прекрасно, они не одинаковы. 'uint64_t' является 64-битным и всегда будет таким. Через 10 лет «unsigned long long» может быть 128. Это небольшой вопрос, но почему я использовал unsignedLongLong.
источник
Я написал класс, чтобы получить доступную / использованную память, используя Swift. Демонстрация по адресу: https://github.com/thanhcuong1990/swift-disk-status
Swift 4 обновлена.
демонстрация
источник
Если вам нужна отформатированная строка с размером, вы можете взглянуть на красивую библиотеку на GitHub :
источник
Не используйте «unsigned», это всего лишь 32 бита, которые будут переполнены после 4 ГБ, что меньше, чем обычное свободное пространство iPad / iPhone. Используйте unsigned long long (или uint64_t) и извлеките значение из NSNumber как 64-разрядного типа int, также используя unsignedLongLongValue.
источник
Если вы хотите получить оставшееся свободное пространство с помощью Swift, это немного отличается. Вам нужно использовать attributeOfFileSystemForPath () вместо attributeOfItemAtPath ():
Edit: Обновление для Swift 1.0
Edit 2: Обновление для безопасности, используя ответ Мартина R в .
Редактировать 3: Обновлено для Swift 2.0 (от dgellow )
источник
Вот мой ответ и почему это лучше.
Ответ (Свифт):
Ответ (Цель-C):
Почему лучше
NSByteCountFormatter
, что означает отсутствие сумасшедших ручных вычислений от байтов до гигабайт. Apple делает это для вас!NSByteCountFormatter
делает это за вас. Например, когда язык устройства установлен на английский, строка будет иметь значение 248,8 МБ, но будет иметь значение 248,8 Мо при установке на французский и т. Д. Для других языков.источник
Важное уточнение (по крайней мере для меня). Если я подключу свой iPod к своему Mac, это информация, отображаемая iTunes App.
Когда я использую приведенный выше код:
CountStyle NSByteCountFormatterCountStyleFile показать мне: 17,41 ГБ
CountStyle NSByteCountFormatterCountStyleBinary показать мне: 16,22 ГБ
16,22 GB ( NSByteCountFormatterCountStyleBinary ) Это ТОЧНО число , что ITunes App показать мне , когда я подключить айпод к моему Mac.
источник
Обновите с новым точным API, чтобы получить доступный размер на диске, доступном в iOS11. Вот описание для нового ключа ресурса API:
Я сопоставил результаты ключа « FileAttributeKey.systemFreeSize » и ключа « URLResourceKey.volumeAvailableCapacityForImportantUsageKey » и обнаружил, что возвращенная форма результатов « volumeAvailableCapacityForImportantUsageKey » точно соответствует доступному хранилищу, отображаемому в пользовательском интерфейсе. Вот быстрая реализация:
источник
volumeAvailableCapacityForOpportunisticUsageKey
.NSHomeDirectory()
илиNSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
. Есть ли разница, используя эти два?Вы можете найти другое решение , с помощью Swift 4 и
extension
которая дает вам вариант хороший.Вот
UIDevice
расширение.И пример использования:
источник
!
вместо этого, чтобы положитьguard
в сейфtypecasting
илиnil
проверить.Для iOS> = 6.0 вы можете использовать новое
NSByteCountFormatter
. Этот код получает количество свободных байтов, оставшихся в виде отформатированной строки.источник
Следующий код является реализацией версии Swift 3.0 ответа, ранее предоставленного ChrisJF:
источник
для Swift как расширение UIDevice
Как пользоваться:
Выход будет:
источник
Я знаю, что этот пост немного стар, но я думаю, что этот ответ может кому-то помочь. Если вы хотите узнать используемое / свободное / общее дисковое пространство на устройстве, вы можете использовать Luminous . Это написано на Swift. Вам остается только позвонить:
или
источник
Быстрая реализация приведенного выше кода: -
Назовите это из любого другого класса.
При тестировании возвращаемого значения оно совпадает с показанным в других приложениях. По крайней мере, в моем iPhone 6S +. Это просто быстрая реализация показанного выше ответа. И для меня принятый ответ не сработал.
источник
Ответ ChrisJF в версии Swift 2.1 :
источник
Если вы хотите сэкономить время, используйте следующую библиотеку CocoaPod. Я не использовал это, но похоже, что это должно работать.
https://cocoapods.org/pods/SystemServices
источник
Расширение Swift 5 для
FileManager
с правильной обработкой ошибок и без автоматического преобразования строк (конвертируйте количество байтов в строку по своему усмотрению). Также следуетFileManager
наименование.Пример использования:
источник