我试图获取本地存储在我的计算机上的软件包的包大小,例如,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);
任何想法的人?
答案 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;
}