2012-05-23 20 views
5

Estoy almacenando archivos en un directorio de documentos locales, separados por carpetas. ¿Hay alguna manera fácil de obtener el tamaño de archivo del contenido del directorio de documentos y todos los subdirectorios en un iPhone?iOS recursive folder size

Puedo iterar manualmente carpetas y seguir agregando tamaño de archivo, pero espero que haya algo más limpio y más eficiente.

¡Gracias!

+1

Cálculo del tamaño de un directorio que ocupa en el disco es en realidad un poco más complicado. Averigüe cómo en [esta respuesta] (http://stackoverflow.com/a/28660040/104790) a una pregunta similar. –

Respuesta

4

recursiva Usted puede ir sobre todas las carpetas y obtener el tamaño. De esta manera:

+(NSUInteger)getDirectoryFileSize:(NSURL *)directoryUrl 
{ 
    NSUInteger result = 0; 
    NSArray *properties = [NSArray arrayWithObjects: NSURLLocalizedNameKey, 
          NSURLCreationDateKey, NSURLLocalizedTypeDescriptionKey, nil]; 

    NSArray *array = [[NSFileManager defaultManager] 
         contentsOfDirectoryAtURL:directoryUrl 
         includingPropertiesForKeys:properties 
         options:(NSDirectoryEnumerationSkipsHiddenFiles) 
         error:nil]; 

    for (NSURL *fileSystemItem in array) { 
     BOOL directory = NO; 
     [[NSFileManager defaultManager] fileExistsAtPath:[fileSystemItem path] isDirectory:&directory]; 
     if (!directory) { 
      result += [[[[NSFileManager defaultManager] attributesOfItemAtPath:[fileSystemItem path] error:nil] objectForKey:NSFileSize] unsignedIntegerValue]; 
     } 
     else { 
      result += [CacheManager getDirectoryFileSize:fileSystemItem]; 
     } 
    } 

    return result; 
} 
3

El enfoque y la eficacia varían según la versión de iOS. Para iOS 4.0 y posterior se puede hacer una categoría de NSFileManager con algo como esto:

- (unsigned long long)contentSizeOfDirectoryAtURL:(NSURL *)directoryURL 
{ 
    unsigned long long contentSize = 0; 
    NSDirectoryEnumerator *enumerator = [self enumeratorAtURL:directoryURL includingPropertiesForKeys:[NSArray arrayWithObject:NSURLFileSizeKey] options:NSDirectoryEnumerationSkipsHiddenFiles errorHandler:NULL]; 
    NSNumber *value = nil; 
    for (NSURL *itemURL in enumerator) { 
     if ([itemURL getResourceValue:&value forKey:NSURLFileSizeKey error:NULL]) { 
      contentSize += value.unsignedLongLongValue; 
     } 
    } 
    return contentSize; 
}