如何获得包装尺寸(应用程序,.pkg等)#?

时间:2015-01-18 20:01:30

标签: objective-c macos

我试图获取本地存储在我的计算机上的软件包的包大小,例如,Applications目录中的每个项目。

我可以在使用以下内容时获得尺寸,但仅限于文件,而不是包裹。

我知道我可以通过包本身枚举,并添加该包中包含的所有文件的大小,就像标准目录一样,
但这对我来说性能太贵了,

因为,当进入Applications目录并点击每个应用程序时,您可以立即获得包大小,而无需等待几秒/分钟来计算多个GB应用程序, 我确定这个包装尺寸'价值存储在某个地方,我无法找到我在哪里以及如何访问它。

到目前为止,我一直试图关注,这对于获取文件的大小非常有效 请注意,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);  

任何想法的人?

1 个答案:

答案 0 :(得分:0)

派对很晚......但也许对其他人有帮助

/*
 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;
}