Objective c 如何获取包大小(应用程序、.pkg等';)?
我正在尝试获取本地存储在计算机上的包的包大小,例如,Objective c 如何获取包大小(应用程序、.pkg等';)?,objective-c,macos,Objective C,Macos,我正在尝试获取本地存储在计算机上的包的包大小,例如,Applications目录中的每个项目 我可以在使用以下工具时获得大小,但仅适用于文件,而不适用于软件包 我知道我可以通过包本身进行枚举,并添加包中包含的所有文件的大小,就像使用标准目录一样, 但这对我来说太贵了 而且,当您进入应用程序目录并单击每个应用程序时,您可以立即获得软件包大小,而无需等待几秒/分钟来计算几个GBs应用程序, 我确信这个“包大小”值存储在某个地方,我只是找不到在哪里以及如何访问它 到目前为止,我已经尝试了以下方法,这对
Applications
目录中的每个项目
我可以在使用以下工具时获得大小,但仅适用于文件,而不适用于软件包
我知道我可以通过包本身进行枚举,并添加包中包含的所有文件的大小,就像使用标准目录一样,但这对我来说太贵了 而且,当您进入
应用程序
目录并单击每个应用程序时,您可以立即获得软件包大小,而无需等待几秒/分钟来计算几个GBs应用程序,我确信这个“包大小”值存储在某个地方,我只是找不到在哪里以及如何访问它 到目前为止,我已经尝试了以下方法,这对于获取文件大小非常有效。
请注意,
self.url
是项路径的NSURL
属性
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[self.url path] error:nil];
NSString *fileSize = [attributes objectForKey:NSFileSize];
NSLog(@"%@", fileSize);
// Always returns 102
NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingAtPath:[self.url path]];
unsigned long long fisize = [fileHandle seekToEndOfFile];
NSLog(@"%lld", fisize);
// Always return 0
// All of the below always return NULL
id value = nil;
[self.url getResourceValue:&value forKey:NSURLFileSizeKey error:nil];
NSLog(@"%@", value);
[self.url getResourceValue:&value forKey:NSURLFileAllocatedSizeKey error:nil];
NSLog(@"%@", value);
[self.url getResourceValue:&value forKey:NSURLTotalFileAllocatedSizeKey error:nil];
NSLog(@"%@", value);
[self.url getResourceValue:&value forKey:NSURLTotalFileSizeKey error:nil];
NSLog(@"%@", value);
伙计们,有什么好主意吗?晚会已经很晚了。。。但也许对其他人也有帮助
/*
sizeOfObjectAtURL:
*/
+ (unsigned long long)sizeOfObjectAtURL:(NSURL *)pURL {
unsigned long long size = 0;
NSNumber* fileSizeValue = nil;
NSError* error = nil;
BOOL success = [pURL getResourceValue:&fileSizeValue
forKey:NSURLFileSizeKey
error:&error];
if (fileSizeValue) {
size = fileSizeValue.longLongValue;
}
else if (success) {
NSNumber* isPackageValue = nil;
success = [pURL getResourceValue:&isPackageValue
forKey:NSURLIsPackageKey
error:&error];
NSNumber* isDirectoryValue = nil;
success = [pURL getResourceValue:&isDirectoryValue
forKey:NSURLIsDirectoryKey
error:&error];
if ((isPackageValue.boolValue) ||
(isDirectoryValue.boolValue)) {
NSArray<NSURL*>* contents = [NSFileManager.defaultManager contentsOfDirectoryAtURL:pURL
includingPropertiesForKeys:@[NSURLFileSizeKey]
options:0
error:&error];
for (NSURL* itemURL in contents) {
size += [self sizeOfObjectAtURL:itemURL];
}
}
else {
// Unknown problem
}
}
return size;
}
/*
尺寸对象:
*/
+(unsigned long long)sizeofobject属性:(NSURL*)pURL{
无符号长尺寸=0;
NSNumber*fileSizeValue=nil;
n错误*错误=nil;
BOOL success=[pull getResourceValue:&fileSizeValue
forKey:NSURLFileSizeKey
错误:&错误];
if(fileSizeValue){
size=fileSizeValue.longValue;
}
否则(成功){
NSNumber*isPackageValue=nil;
success=[pURL getResourceValue:&isPackageValue
forKey:NSURLIsPackageKey
错误:&错误];
NSNumber*isDirectoryValue=nil;
success=[pURL getResourceValue:&isDirectoryValue
forKey:NSURLIsDirectoryKey
错误:&错误];
if((isPackageValue.boolValue)||
(isDirectoryValue.boolValue)){
NSArray*contents=[NSFileManager.defaultManager内容目录:pURL
包括属性分叉:@[NSURLFileSizeKey]
选项:0
错误:&错误];
for(目录中的NSURL*itemURL){
大小+=[自身大小fobjectturl:itemURL];
}
}
否则{
//未知问题
}
}
返回大小;
}
如果我进入“应用程序”文件夹浏览应用程序,请记住我以前可能从未在这台机器上专门这么做过,而且在重启后肯定没有,我必须等待几秒钟才能计算出几个大小。您是否考虑过使用命令行工具,可能是du
?@Wain,谢谢您的命令行建议,伙计,但获取软件包大小不是最终目标,我需要在我的应用程序中使用它。这就是我的意思,第一次它做一些计算,但在第一次之后,你会立即收到文件,这意味着操作系统会将该属性存储在某个地方。还有其他想法吗?我猜查找器会缓存大小,并可能监视事件队列的更改。不过这只是一个猜测。