Размер файла в COCOA API узнать довольно просто, например:
NSNumber *value = nil;
[url getResourceValue:&value forKey:NSURLFileSizeKey error:nil];
NSUInteger size = [value unsignedLongLongValue];
NSLog(@"File size: %li", size);
Но вот как, примерно таким же простым способом, можно узнать размер каталога?
Сейчас что бы получить размер каталога я использую методом рекурсивного перебора, например так:
off_t sizeForFolderStat(const char *path)
{
off_t size = 0;
DIR *directory;
directory = opendir(path);
if (directory == NULL) {
fprintf(stderr, "could not open directory '%s'\n", path);
fprintf(stderr, "error is %d/%s\n", errno, strerror(errno));
exit (EXIT_FAILURE);
}
struct dirent *entry;
while ( (entry = readdir(directory)) != NULL) {
char filename[MAXPATHLEN];
int result;
struct stat statbuf;
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
snprintf(filename, MAXPATHLEN, "%s/%s", path, entry->d_name);
result = lstat(filename, &statbuf);
if (result != 0) {
fprintf (stderr, "could not stat '%s': %d/%s\n", entry->d_name, errno, strerror(errno));
continue;
}
if (S_ISDIR(statbuf.st_mode)) {
size += sizeForFolderStat(filename);
} else {
size += statbuf.st_size;
}
}
closedir(directory);
return size;
}
Эта функция работает довольно быстро, но когда каталог содержит много вложений она может хорошо нагружать процессор.
В поисках простых способов получить размер каталога я обнаружил что с помощью класса
NSMetadataItem
можно очень просто и быстро получить размер приложения:
NSUInteger size = 0;
NSNumber *isApp;
[url getResourceValue:&isApp forKey:NSURLIsApplicationKey error:nil];
if ([isApp boolValue]) {
NSMetadataItem *metadata = [[NSMetadataItem alloc] initWithURL:url];
size = [[metadata valueForAttribute:@"kMDItemFSSize"] unsignedLongLongValue];
}
По сути .app это тоже каталог но для обычных каталогов(папок) или пакетов этот способ возвращает только размер папки (примерно 4Kb), а не полный размер каталога включая размер всего его содержимого.
Я подозреваю что для пакетов или каталогов(папок) тоже есть подобные способы - быстро и просто получить размер каталога включая размер всего его содержимого.
Если кто-то знает как это сделать пожалуйста поделитесь опытом.
Или расскажите как вы получаете размер каталогов?
Всем заранее спасибо.