Pregunta

En este momento estoy usando este código para obtener el tamaño de una carpeta:

NSArray *contents;
        NSEnumerator *enumerator;
        NSString *path;
        contents = [[NSFileManager defaultManager] subpathsAtPath:folderPath];
        enumerator = [contents objectEnumerator];
        while (path = [enumerator nextObject]) {
            NSDictionary *fattrib = [[NSFileManager defaultManager] fileAttributesAtPath:[folderPath stringByAppendingPathComponent:path] traverseLink:YES];
            fileSize +=[fattrib fileSize];
        }

        [contents release];
        [path release]; 

El problema es que su muy Incorrecto. Es bien añade unos pocos megabytes o descuenta unos pocos megabytes de tamaño real. Por ejemplo, yo tengo el tamaño de archivo de un paquete .app y este método reportado 16.2MB, mientras que la cosa real es 15,8.

¿Cuál es la mejor manera de obtener el tamaño de una carpeta?

Gracias

¿Fue útil?

Solución

que tenía que hacer esto hoy mismo, y me he dado cuenta que el código en este puesto en la lista de cacao-dev es súper rápido y coincide con lo Buscador dice al byte. (No se olvide de O en la bandera kFSCatInfoRsrcSizes para que pueda obtener tamaños de horquilla de recursos, también!)

Si necesita más explicación sobre cómo usarlo, simplemente dejar un comentario y voy a editar esta entrada. =)

Otros consejos

La documentación para fileSize afirma que no incluye el tamaño de un tenedor de recursos. Puede que tenga que utilizar Archivo de carbono del rel="nofollow Manager API para calcular de forma fiable tamaño de los directorios.

Sólo quería sugerencia de segundo de Dave DeLong sobre el puesto de Cacao-dev, pero añaden una nota de precaución para asegurarse de leer todas las publicaciones de la secuencia. Hay uno por Rosyna que es particularmente digno de mención. En mi caso he seguido ese consejo (cambiando artículos max por recuperación a 40) y vi un salto de velocidad, así como el final de un error estrellarse desagradable.

Esperamos que esto ayude

- (unsigned long long) fastFolderSizeAtFSRef:(NSString *)theFilePath
{
unsigned long long totalSize = 0;
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL  isdirectory;
NSError *error;

if ([fileManager fileExistsAtPath:theFilePath])
{


    NSMutableArray * directoryContents = [[fileManager contentsOfDirectoryAtPath:theFilePath error:&error] mutableCopy];


    for (NSString *fileName in directoryContents)
    {
        if (([fileName rangeOfString:@".DS_Store"].location != NSNotFound) )
            continue;



            NSString *path = [theFilePath stringByAppendingPathComponent:fileName];
            if([fileManager fileExistsAtPath:path isDirectory:&isdirectory] && isdirectory  )
            {

                    totalSize =  totalSize + [self fastFolderSizeAtFSRef:path];



            }
            else
            {
                unsigned long long fileSize = [[fileManager attributesOfItemAtPath:path error:&error] fileSize];
                totalSize = totalSize + fileSize;
            }
    }
}
return totalSize;
}

Esto es típicamente cómo se hace. 2 posibilidades:

  1. Comprobar el byte -> rutinas de conversión megabyte. También, qué quiere megabytes o mebibytes? (Probablemente depende de lo que lo está comparando a.)

  2. Trate pasando NO para el parámetro traverseLink. Podría muy bien ser un enlace simbólico en el haz que apunta a algo más que la rutina lo está comparando a no dará cuenta de. Ya sea que usted cuente algo en el paquete dos veces, o tendrá que incluir algo fuera del paquete completo (lo más probable lo primero).

Sé que este es un viejo tema. Pero para alguien por ahí en busca de respuestas sobre cómo hacer esto,

[[NSFileManager defaultManager] fileExistsAtPath:path isDirectory:&isDir];
        if (isDir) {
            NSPipe *pipe = [NSPipe pipe];
            NSTask *t = [[[NSTask alloc] init] autorelease];
            [t setLaunchPath:@"/usr/bin/du"];
            [t setArguments:[NSArray arrayWithObjects:@"-k", @"-d", @"0", path, nil]];
            [t setStandardOutput:pipe];
            [t setStandardError:[NSPipe pipe]];

            [t launch];

            [t waitUntilExit];

            NSString *sizeString = [[[NSString alloc] initWithData:[[pipe fileHandleForReading] availableData] encoding:NSASCIIStringEncoding] autorelease];
            sizeString = [[sizeString componentsSeparatedByString:@" "] objectAtIndex:0];
            bytes = [sizeString longLongValue]*1024;
        }
        else {
            bytes = [[[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil] fileSize];
        }

Se utilizará el terminal para determinar un tamaño de carpetas en bytes. Y utilizará cacao incorporado en NSFileManager para obtener el tamaño de los archivos. Es muy rápido, y obtiene el tamaño exacto que Buscador de informes.

Este código es el de extensión (categoría) a la clase NSFileManager. Se resume los tamaños de todo el contenido de la carpeta.  Tenga en cuenta que el tratamiento de error podría mejorarse.

 @interface NSFileManager(Util)

        - (NSNumber *)sizeForFolderAtPath:(NSString *) source error:(NSError **)error;

    @end

    @implementation NSFileManager(Util)

        - (NSNumber *)sizeForFolderAtPath:(NSString *) source error:(NSError **)error
        {
            NSArray * contents;
            unsigned long long size = 0;
            NSEnumerator * enumerator;
            NSString * path;
            BOOL isDirectory;

            // Determine Paths to Add 
            if ([self fileExistsAtPath:source isDirectory:&isDirectory] && isDirectory) 
            { 
                contents = [self subpathsAtPath:source]; 
            } 
            else 
            { 
                contents = [NSArray array];
            }
            // Add Size Of All Paths 
            enumerator = [contents objectEnumerator]; 
            while (path = [enumerator nextObject]) 
            {
                NSDictionary * fattrs = [self attributesOfItemAtPath: [ source stringByAppendingPathComponent:path ] error:error];
                size += [[fattrs objectForKey:NSFileSize] unsignedLongLongValue]; 
            }
            // Return Total Size in Bytes 

            return [ NSNumber numberWithUnsignedLongLong:size];
        }

        @end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top