2012-05-23 2 views
5

Sto memorizzando i file in una directory di documenti locali, separati da cartelle. C'è un modo semplice per me di ottenere la dimensione del file del contenuto della directory dei documenti e tutte le sottodirectory su un iPhone?Dimensione cartella ricorsiva iOS

Posso scorrere manualmente le cartelle e continuare ad aggiungere le dimensioni del file, ma spero che ci sia qualcosa di più pulito e più efficiente.

Grazie!

+1

Calcolare la dimensione che una directory occupa su disco è in realtà un po 'più coinvolta. Scopri come in [questa risposta] (http://stackoverflow.com/a/28660040/104790) a una domanda simile. –

risposta

4

Si può ricorsivamente andare oltre tutte le cartelle e ottenere la dimensione. In questo modo:

+(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

L'approccio e l'efficienza variano a seconda della versione di iOS. Per iOS 4.0 e versioni successive è possibile effettuare una categoria a NSFileManager con qualcosa di simile:

- (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; 
}