absterno
@absterno

Как в COCOA API узнать размер каталога, пакета и.т.д?

Размер файла в 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), а не полный размер каталога включая размер всего его содержимого.
Я подозреваю что для пакетов или каталогов(папок) тоже есть подобные способы - быстро и просто получить размер каталога включая размер всего его содержимого.

Если кто-то знает как это сделать пожалуйста поделитесь опытом.
Или расскажите как вы получаете размер каталогов?

Всем заранее спасибо.
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы