Как я могу рассчитать размер папки? - PullRequest
64 голосов
/ 03 февраля 2010

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

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

Как лучше всего это сделать?

Ответы [ 15 ]

1 голос
/ 14 января 2015

Быстрое внедрение

class func folderSize(folderPath:String) -> UInt{

    // @see /2204127/kak-ya-mogu-rasschitat-razmer-papki

    let filesArray:[String] = NSFileManager.defaultManager().subpathsOfDirectoryAtPath(folderPath, error: nil)! as [String]
    var fileSize:UInt = 0

    for fileName in filesArray{
        let filePath = folderPath.stringByAppendingPathComponent(fileName)
        let fileDictionary:NSDictionary = NSFileManager.defaultManager().attributesOfItemAtPath(filePath, error: nil)!
        fileSize += UInt(fileDictionary.fileSize())

    }

    return fileSize
}
1 голос
/ 25 июля 2013

Я немного очистил реализацию первого ответа перед его использованием, поэтому он больше не выдает устаревшие предупреждения + с помощью быстрого перечисления.

/**
 *  Calculates the size of a folder.
 *
 *  @param  folderPath  The path of the folder
 *
 *  @return folder size in bytes
 */
- (unsigned long long int)folderSize:(NSString *)folderPath {
    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *filesArray = [fm subpathsOfDirectoryAtPath:folderPath error:nil];
    unsigned long long int fileSize = 0;

    NSError *error;
    for(NSString *fileName in filesArray) {
        error = nil;
        NSDictionary *fileDictionary = [fm attributesOfItemAtPath:[folderPath     stringByAppendingPathComponent:fileName] error:&error];
        if (!error) {
            fileSize += [fileDictionary fileSize];
        }else{
            NSLog(@"ERROR: %@", error);
        }
    }

    return fileSize;
}
1 голос
/ 02 апреля 2012

если мы хотим получить размер любого файла, то вот метод, в котором нам нужно только указать путь к этому файлу.

- (unsigned long long int) fileSizeAt:(NSString *)path {
    NSFileManager *_manager = [NSFileManager defaultManager];
    return [[_manager fileAttributesAtPath:path traverseLink:YES] fileSize];
}
0 голосов
/ 21 августа 2015

Я создал простое расширение NSFileManager:

extension NSFileManager {
  func fileSizeAtPath(path: String) -> Int {
    return attributesOfItemAtPath(path, error: nil)?[NSFileSize] as? Int ?? 0
  }

  func folderSizeAtPath(path: String) -> Int {
    var size = 0
    for file in subpathsOfDirectoryAtPath(path, error: nil) as? [String] ?? [] {
      size += fileSizeAtPath(path.stringByAppendingPathComponent(file))
    }
    return size
  }
}

Вы можете получить размер файла:

NSFileManager.defaultManager().fileSizeAtPath("file path")

и размер папки:

NSFileManager.defaultManager().folderSizeAtPath("folder path")
0 голосов
/ 23 августа 2012

Не уверен, поможет ли это кому-нибудь, но я хотел бы рассказать о некоторых из моих выводов (некоторые вдохновлены комментарием @ zneak выше).

  1. Мне не удалось найти ярлыки, использующие NSDirectoryEnumerator, чтобы избежать перечисления по файлам для получения общего размера каталога.

  2. Для моих тестов использование -[NSFileManager subpathsOfDirectoryAtPath:path error:nil] было быстрее, чем использование -[NSFileManager enumeratorAtPath:path]. Мне кажется, что это может быть классический компромисс между временем и пространством, поскольку subPaths... создает NSArray, для которого он затем выполняет итерацию, где enumerator... может и не быть.

Немного предыстории # 1. Предполагая, что:

NSFileManager *fileMan = [NSFileManager defaultManager];
NSString *dirPath = @"/"; // references some directory

Тогда

[fileMan enumeratorAtPath:dirPath] fileAttributes]

возвращает nil. Правильный атрибут доступа - directoryAttributes, но

[fileMan enumeratorAtPath:dirPath] directoryAttributes] fileSize]

возвращает размер информации каталога, а не рекурсивную сумму размеров всех содержащихся в ней файлов (а-ля I в Finder).

...