77 votes

Calculer la taille d'un dossier

Juste une petite...

Je crée un dossier pour mettre les images en cache à l'intérieur de Documents avec mon iPhone. Je veux être en mesure de maintenir la taille de ce dossier vers le bas à 1 mo, j'ai donc besoin de vérifier la taille en octets de mon dossier.

J'ai le code pour calculer la taille de fichier, mais j'ai besoin de la taille du dossier.

Quelle serait la meilleure façon de le faire? Ai-je besoin d'une boucle sur chaque fichier?

Cheers

43voto

joseph_carney Points 564

Un grand bravo à Alex, vous a aidé beaucoup, ont écrit la fonction suivante, qui fait le tour...

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

Il est à venir avec le nombre exact d'octets comme Finder.

En aparté, le Finder des rendements à deux chiffres. L'un est la taille du disque dur, et l'autre est le nombre réel d'octets.

Par exemple, lorsque j'exécute ce code sur un de mes dossiers, il revient dans le code avec une "taille" de 130398. Quand je vérifie dans le Finder, il est dit que la taille est 201KB sur le disque (130,398 octets).

Suis un peu incertain de ce qu'il faut aller ici (201KB ou 130,398 octets) que la taille réelle. Pour l'instant, je vais aller sur le côté sécuritaire et couper ma limite de moitié jusqu'à ce que je trouve ce que cela signifie exactement...

Si quelqu'un peut plus ajouter de l'information à ces différents chiffres, je l'apprécierais.

Cheers,

37voto

TheTiger Points 5776

C'est la façon d'obtenir de dossier et de fichier size en MO, KO et GO ---

1. Taille Du Dossier -

-(NSString *)sizeOfFolder:(NSString *)folderPath
{
    NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:nil];
    NSEnumerator *contentsEnumurator = [contents objectEnumerator];

    NSString *file;
    unsigned long long int folderSize = 0;

    while (file = [contentsEnumurator nextObject]) {
        NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:file] error:nil];
        folderSize += [[fileAttributes objectForKey:NSFileSize] intValue];
    }

    //This line will give you formatted size from bytes ....
    NSString *folderSizeStr = [NSByteCountFormatter stringFromByteCount:folderSize countStyle:NSByteCountFormatterCountStyleFile];
    return folderSizeStr;
}

Remarque: En cas de sous-dossiers, veuillez utiliser subpathsOfDirectoryAtPath: au lieu de contentsOfDirectoryAtPath:

2. La Taille Du Fichier

-(NSString *)sizeOfFile:(NSString *)filePath
{
    NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
    NSInteger fileSize = [[fileAttributes objectForKey:NSFileSize] integerValue];
    NSString *fileSizeStr = [NSByteCountFormatter stringFromByteCount:fileSize countStyle:NSByteCountFormatterCountStyleFile];
    return fileSizeStr;
}

30voto

ndoc Points 350

Dans iOS 5 la méthode de -filesAttributesAtPath: est obsolète. Voici la version du premier code posté avec la nouvelle méthode:

- (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] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:fileName] error:nil];
        fileSize += [fileDictionary fileSize];
    }

    return fileSize;
}

11voto

Alex Reynolds Points 45039

Quelque chose comme ce qui suit devrait vous aider à démarrer. Vous aurez besoin de modifier _documentsDirectory de votre dossier:

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

4voto

WrightsCS Points 32170

J'ai utilisé ce code pour obtenir le répertoire de la taille de 2 répertoires, si un répertoire n'existe pas, ce serait montrer Zéro KO. Sinon, la deuxième moitié du code affiche la taille du dossier avec le KO, MO, GO, respectivement, et il sera également l'afficher dans un endroit propre format: 10.02 MB.

Essayez ce quelque chose comme ceci:

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

-(NSString *)getMPSize
{
    NSString*sizeTypeW = @"bytes";
    int app = [self folderSize:@"/PathToTheFolderYouWantTheSizeOf/"];
    NSFileManager *manager = [NSFileManager defaultManager];
    if([manager fileExistsAtPath:@"/AnotherFolder/"] == YES){

        int working = [self folderSize:@"/AnotherFolder/"];
        if(working<1){
            return @"Size: Zero KB";
        }else{
            if (working > 1024)
            {
                //Kilobytes
                working = working / 1024;

                sizeTypeW = @" KB";
            }

            if (working > 1024)
            {
                //Megabytes
                working = working / 1024;

                sizeTypeW = @" MB";
            }

            if (working > 1024)
            {
                //Gigabytes
                working = working / 1024;

                sizeTypeW = @" GB";
            }

            return [NSString stringWithFormat:@"App: %i MB, Working: %i %@ ",app/1024/1024, working,sizeTypeW];
        }

    }else{
        return [NSString stringWithFormat:@"App: %i MB, Working: Zero KB",app/1024/1024];
    }
    [manager release];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X