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,谢谢您的命令行建议,伙计,但获取软件包大小不是最终目标,我需要在我的应用程序中使用它。这就是我的意思,第一次它做一些计算,但在第一次之后,你会立即收到文件,这意味着操作系统会将该属性存储在某个地方。还有其他想法吗?我猜查找器会缓存大小,并可能监视事件队列的更改。不过这只是一个猜测。