Как я могу вычислить размер папки?

Я создаю папку для кэширования изображений в Документах с моим приложением для iPhone. Я хочу смочь подавить размер этой папки к 1 МБ, таким образом, я должен для проверки размера в байты моей папки.

У меня есть код для вычисления размера файла, но мне нужен размер папки.

Каков был бы лучший способ сделать это?

66
задан JohnOsborne 17 April 2018 в 13:21
поделиться

2 ответа

Что-то вроде следующего должно помочь вам начать работу. Однако вам нужно будет изменить _documentsDirectory на вашу конкретную папку:

- (unsigned long long int) documentsFolderSize {
    NSFileManager *_manager = [NSFileManager defaultManager];
    NSArray *_documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *_documentsDirectory = [_documentPaths objectAtIndex:0];   
    NSArray *_documentsFileList;
    NSEnumerator *_documentsEnumerator;
    NSString *_documentFilePath;
    unsigned long long int _documentsFolderSize = 0;

    _documentsFileList = [_manager subpathsAtPath:_documentsDirectory];
    _documentsEnumerator = [_documentsFileList objectEnumerator];
    while (_documentFilePath = [_documentsEnumerator nextObject]) {
        NSDictionary *_documentFileAttributes = [_manager fileAttributesAtPath:[_documentsDirectory stringByAppendingPathComponent:_documentFilePath] traverseLink:YES];
        _documentsFolderSize += [_documentFileAttributes fileSize];
    }

    return _documentsFolderSize;
}
10
ответ дан 24 November 2019 в 14:49
поделиться

Здравствуйте, Алекс, вы очень помогли, теперь написали следующую функцию, которая делает свое дело ...

- (unsigned long long int)folderSize:(NSString *)folderPath {
    NSArray *filesArray = [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:folderPath error:nil];
    NSEnumerator *filesEnumerator = [filesArray objectEnumerator];
    NSString *fileName;
    unsigned long long int fileSize = 0;

    while (fileName = [filesEnumerator nextObject]) {
        NSDictionary *fileDictionary = [[NSFileManager defaultManager] fileAttributesAtPath:[folderPath stringByAppendingPathComponent:fileName] traverseLink:YES];
        fileSize += [fileDictionary fileSize];
    }

    return fileSize;
}

Она предлагает точное количество байтов, как это делает Finder.

Кроме того, Finder возвращает два числа. Один - это размер на диске, а другой - фактическое количество байтов.

Например, когда я запускаю этот код в одной из своих папок, он возвращается в коде с 'fileSize' равным 130398. Когда я проверяю Finder, он говорит, что размер на диске составляет 201 КБ (130 398 байт).

Я немного не уверен, что использовать здесь (201 КБ или 130 398 байт) в качестве фактического размера. А пока я буду осторожен и уменьшу свой лимит вдвое, пока не выясню, что именно это означает ...

Если кто-нибудь может добавить дополнительную информацию к этим разным числам, я буду признателен.

Ура,

42
ответ дан 24 November 2019 в 14:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: