Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取磁盘空间属性NSFileSystem+;属性办公系统不';无法在iOS设置应用程序中匹配信息_Ios_Objective C_Xcode_Nsfilemanager_Nsdocumentdirectory - Fatal编程技术网

获取磁盘空间属性NSFileSystem+;属性办公系统不';无法在iOS设置应用程序中匹配信息

获取磁盘空间属性NSFileSystem+;属性办公系统不';无法在iOS设置应用程序中匹配信息,ios,objective-c,xcode,nsfilemanager,nsdocumentdirectory,Ios,Objective C,Xcode,Nsfilemanager,Nsdocumentdirectory,我正在尝试使用以下代码从我的iOS应用程序中获取总/已用/可用空间(以字节为单位),这些代码改编自本网站上的各种解决方案 - (unsigned long long)totalDiskSpace { unsigned long long space = 0; NSError *error = nil; NSArray<NSString *> *paths = NSSearchPathForDirectoriesInDomains(NSDocume

我正在尝试使用以下代码从我的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;
}
-(无符号长)总磁盘空间{
无符号长空间=0;
n错误*错误=nil;
NSArray*Path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,是);
NSDictionary*dict=[[NSFileManager defaultManager]属性OfficeSystemForPath:Path.lastObject错误:&error];
if(dict){
NSNumber*size=dict[NSFileSystemSize];
空格=size.unsignedLongValue;
}
返回空间;
}
-(无符号长)空闲磁盘空间{
无符号长空间=0;
n错误*错误=nil;
NSArray*Path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,是);
NSDictionary*dict=[[NSFileManager defaultManager]属性OfficeSystemForPath:Path.lastObject错误:&error];
if(dict){
NSNumber*size=dict[NSFileSystemFreeSize];
空格=size.unsignedLongValue;
}
返回空间;
}
问题是,当我将这些值与用户在Settings.app中可能看到的值进行比较时,它们完全不符合我在256 GB iPhone X上进行的测试,虽然“总”空间值是正确的,但“空闲”空间的值似乎比应该的要小得多

在我的设备上,我得到的值是
255937040384
(~255GB),但只有
175536754688
是免费的,这意味着
80400285696
已使用(~80GB)。但是,在Settings.app中,我的设备显示仅使用了52.4 GB


有人知道原因吗?

不要使用
NSFileManager
,而是使用
NSURL
resourcesvaluesforkeys:
方法获取驱动器的可用空间<代码>NSURL在此处提供了三个相关常数:

  • NSURLVolumeAvailableCapacityKey
    -驱动器上的文字可用空间,应与NSFileManager返回的值相同

  • NSURLVolumeAvailableCapacityForImportantUsageKey
    —驱动器上的文字可用空间,加上磁盘上任何“临时”文件的大小,如果需要,这些文件可以自动删除,以便为其他内容提供空间,以及:

  • nsurlVolumeAvailableCapacityforuportUnisticUsageKey
    -临时文件本身的可用空间量,根据我的经验,通常比实际可用空间小一些

在您的情况下,
NSURLVolumeAvailableCapacityForImportantUsageKey
可能是Settings.app报告的值,因为从用户的角度来看,这是您必须使用的空间量


另外,一般来说,如果您使用的是采用路径而不是URL的Apple Objective-C或Swift API,那么它可能是一个遗留API。基于URL的API通常更为完整和最新,通常应优于基于路径的API。在这种情况下,重要/机会主义概念之前的基于路径的API导致其缺乏读取这些值的工具。

而不是使用
NSFileManager
,使用
NSURL
resourcesvaluesforkeys:
方法获取驱动器的可用空间<代码>NSURL在此处提供了三个相关常数:

  • NSURLVolumeAvailableCapacityKey
    -驱动器上的文字可用空间,应与NSFileManager返回的值相同

  • NSURLVolumeAvailableCapacityForImportantUsageKey
    —驱动器上的文字可用空间,加上磁盘上任何“临时”文件的大小,如果需要,这些文件可以自动删除,以便为其他内容提供空间,以及:

  • nsurlVolumeAvailableCapacityforuportUnisticUsageKey
    -临时文件本身的可用空间量,根据我的经验,通常比实际可用空间小一些

在您的情况下,
NSURLVolumeAvailableCapacityForImportantUsageKey
可能是Settings.app报告的值,因为从用户的角度来看,这是您必须使用的空间量


另外,一般来说,如果您使用的是采用路径而不是URL的Apple Objective-C或Swift API,那么它可能是一个遗留API。基于URL的API通常更为完整和最新,在这种情况下,通常应优先于基于路径的API,重要/机会主义概念之前基于路径的API导致它缺乏读取这些值的工具。

如果使用
NSURL
resourceValues市场:
NSURLVolumeCapacityKey
nsurlVolumeTatalCapacityKey
一起使用,您还会看到这一点吗,但我不确定这有什么关系。根据苹果公司的规定,NSURLResourceKey只有总空间的值,而不是可用空间或已用空间的值。我从NSURL获得的总空间值与我从NSFileManager获得的总空间值相同,而且是准确的。这是我寻找的不准确的可用空间量。NSFileManager说,每个设置的可用空间比实际可用空间少约30GB
NSURLResourceKey
包含三个常量来检查可用空间量:
NSURLVolumeAvailableCapacityKey
NSURLVolumeAvailableCapacityForImportantUsageKey
,以及
NSURLVolumeAvailableCapacityForOpportunisticUsageKey
。如果我的预感是正确的,设置应用程序可能会将其中一项读取为可用空间(可能是
…for importantusagekey
),而不是驱动器上的实际空间量。找到答案的一种方法。我没有可以测试的iOS设备,但当我在Mac上尝试时,
NSURLVolumeAvailableCapacityForImportantUsageKey
give