[英]Getting Disk Space Attributes NSFileSystem +attributesOfFileSystem doesn't match info in iOS Settings App
我正在嘗試使用以下代碼,從本網站上的各種解決方案改編而成,以字節為單位從我的iOS應用程序獲取總/已使用/可用空間。
- (unsigned long long)totalDiskSpace {
unsigned long long space = 0;
NSError *error = nil;
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:paths.lastObject error:&error];
if (dict) {
NSNumber *size = dict[NSFileSystemSize];
space = size.unsignedLongLongValue;
}
return space;
}
- (unsigned long long)freeDiskSpace {
unsigned long long space = 0;
NSError *error = nil;
NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSDictionary *dict = [[NSFileManager defaultManager] attributesOfFileSystemForPath:paths.lastObject error:&error];
if (dict) {
NSNumber *size = dict[NSFileSystemFreeSize];
space = size.unsignedLongLongValue;
}
return space;
}
問題是,當我將這些值與使用情況在其Settings.app中看到的值進行比較時,它們完全不可用了,我正在256 GB iPhone X上進行測試,而“總”空間值是正確的,但該值因為“自由”空間似乎要少得多。
在我的設備上,我得到的值是255937040384
(〜255GB),但是免費只有175536754688
,這意味着80400285696
使用了80400285696
( 80400285696
)。 但是,在Settings.app中,我的設備僅顯示52.4 GB的使用空間。
有人知道為什么會這樣嗎?
可以使用NSURL
的resourceValuesForKeys:
方法來獲取驅動器的可用空間,而不是使用NSFileManager
。 NSURL
在此處提供了三個相關的常量:
NSURLVolumeAvailableCapacityKey
驅動器上的文字可用空間,應與NSFileManager
返回的值相同,
NSURLVolumeAvailableCapacityForImportantUsageKey
驅動器上的字面可用空間,再加上磁盤上任何“臨時”文件的大小,可以在需要時自動刪除這些文件以為其他事情提供空間,並且:
NSURLVolumeAvailableCapacityForOpportunisticUsageKey
臨時文件本身可用的空間量,以我的經驗,這通常小於實際的可用空間。
在您的情況下, NSURLVolumeAvailableCapacityForImportantUsageKey
可能是Settings.app報告的值,因為從用戶的角度來看,這就是您必須使用的空間量。
同樣,作為一般規則,如果您使用的是帶路徑而不是URL的Apple Objective-C或Swift API,則可能是舊版API。 基於URL的API通常更完整和最新,並且通常應優先於基於路徑的API-在這種情況下,基於路徑的API優先於重要/機會主義概念會導致其缺乏用於讀取這些值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.