方法1. 通用
NSFileManager attributesOfFileSystemForPath: error:
方法2. available(iOS 11.0)
NSURL resourceValuesForKeys: error:
发现问题:方法1获取到的剩余值并不准确,测得使用剩余值远小于实际的手机存储容量剩余。所以使用方法2优先。下面代码中字典信息的Key值可以获取到对应的容量值。
示例代码:
- #import "UIDevice+DiskSpace.h"
-
-
- + (long)freeDiskSpaceInBytes
- {
- NSString *path = [MYPath document];
- NSError * error = nil;
- if (@available(iOS 11.0, *)) {
- NSURL * url = [[NSURL alloc]initFileURLWithPath:[NSString stringWithFormat:@"%@",path]];
- NSDictionary<NSURLResourceKey, id> * dict = [url resourceValuesForKeys:@[NSURLVolumeTotalCapacityKey,NSURLVolumeAvailableCapacityForImportantUsageKey] error:&error];
- if (error) {
- NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %@", [error domain], @([error code]));
- return 0;
- }
- uint64_t capacity = [dict[NSURLVolumeTotalCapacityKey] longLongValue];
- uint64_t freeSize = [dict[NSURLVolumeAvailableCapacityForImportantUsageKey] longLongValue];
- const uint64_t reserve = 200 * 1024 * 1024; /// 200m保留空间
- const CGFloat GB = 1024 * 1024 * 1024;
- NSLog(@"Memory Capacity of %.2f GB with %.2f GB Free memory available.", capacity / GB, (freeSize - reserve) / GB);
- return freeSize - reserve;
- } else {
- NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:path error:&error];
- if (attributes) {
- uint64_t capacity = [attributes[NSFileSystemSize] unsignedLongLongValue];
- uint64_t freeSize = [attributes[NSFileSystemFreeSize] unsignedLongLongValue];
- const uint64_t reserve = 200 * 1024 * 1024; /// 200m保留空间
- const CGFloat GB = 1024 * 1024 * 1024;
- NSLog(@"Memory Capacity of %.2f GB with %.2f GB Free memory available.", capacity / GB, (freeSize - reserve) / GB);
- return freeSize - reserve;
- }
- NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %@", [error domain], @([error code]));
- return 0;
- }
- }
-