方法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;
}
}