versiones que programación programacion plataforma objective lenguaje ejemplos compiler objective-c macos cocoa

objective c - que - ¿Cómo obtener el tamaño del archivo correctamente y convertirlo a MB, GB en Cocoa?



versiones de objective c (3)

Posible duplicado:
¿Clase ObjC / Cocoa para convertir el tamaño a una secuencia legible por humanos?

Soy nuevo en Cocoa. Estoy tratando de obtener el tamaño correcto de los archivos de la carpeta. Y visualícelo en MB si tiene menos de 1 GB o en GB.

La forma en que quiero que se muestre se redondea con un número después del punto.

Ejemplo 5.5 MB si es más de 1000> 1.1 GB

Estoy tratando de usar esto

unsigned long long size= ([[[NSFileManager defaultManager] attributesOfItemAtPath:fullPath error:nil] fileSize]);

Pero no puedo convertir correctamente el número y mostrarlo como quiero.

Gracias.


Aquí hay un fragmento de código de mi biblioteca. (Por lo tanto, lo libero bajo la licencia BSD simplificada allí). Se ha probado de forma exhaustiva, y hace todo el redondeo exactamente correcto. Esto no es tan trivial como parece. Siempre da dos cifras significativas a menos que imprima tres dígitos (por ejemplo, 980 B) en cuyo caso los tres dígitos son significativos.

Usar stringWithFormat:@"%..something...f" no funcionará porque si redondeas 999999 bytes hasta 1000 kilobytes, deseas mostrarlo como 1.0 MB, no como 1000 kB.

Tenga en cuenta que este código también hace "redondeo bancario" o "redondeo imparcial" o "redondo a par", cualquiera que sea el que quiera llamarlo. Entonces 1050 se convierte en "1.0 kB", pero 1150 se convierte en "1.2 kB". Esta es exactamente la misma manera que printf hace en mi sistema y es el método de redondeo generalmente preferido para este tipo de cosas.

#include <stdio.h> #include <string.h> #include <stdint.h> #define SIZE_BUFSZ 7 static char const SIZE_PREFIXES[] = "kMGTPEZY"; void format_size(char buf[SIZE_BUFSZ], uint64_t sz) { int pfx = 0; unsigned int m, n, rem, hrem; uint64_t a; if (sz <= 0) { memcpy(buf, "0 B", 3); return; } a = sz; if (a < 1000) { n = a; snprintf(buf, SIZE_BUFSZ, "%u B", n); return; } for (pfx = 0, hrem = 0; ; pfx++) { rem = a % 1000ULL; a = a / 1000ULL; if (!SIZE_PREFIXES[pfx + 1] || a < 1000ULL) break; hrem |= rem; } n = a; if (n < 10) { if (rem >= 950) { buf[0] = ''1''; buf[1] = ''0''; buf[2] = '' ''; buf[3] = SIZE_PREFIXES[pfx]; buf[4] = ''B''; buf[5] = ''/0''; return; } else { m = rem / 100; rem = rem % 100; if (rem > 50 || (rem == 50 && ((m & 1) || hrem))) m++; snprintf(buf, SIZE_BUFSZ, "%u.%u %cB", n, m, SIZE_PREFIXES[pfx]); } } else { if (rem > 500 || (rem == 500 && ((n & 1) || hrem))) n++; if (n >= 1000 && SIZE_PREFIXES[pfx + 1]) { buf[0] = ''1''; buf[1] = ''.''; buf[2] = ''0''; buf[3] = '' ''; buf[4] = SIZE_PREFIXES[pfx+1]; buf[5] = ''B''; buf[6] = ''/0''; } else { snprintf(buf, SIZE_BUFSZ, "%u %cB", n, SIZE_PREFIXES[pfx]); } } }

Aquí está la información de la prueba:

{ 0, "0 B" }, { 5, "5 B" }, { 20, "20 B" }, { 100, "100 B" }, { 500, "500 B" }, { 999, "999 B" }, { 1000, "1.0 kB" }, { 1050, "1.0 kB" }, { 1051, "1.1 kB" }, { 2349, "2.3 kB" }, { 2350, "2.4 kB" }, { 9949, "9.9 kB" }, { 9950, "10 kB" }, { 10000, "10 kB" }, { 10500, "10 kB" }, { 10501, "11 kB" }, { 99499, "99 kB" }, { 99500, "100 kB" }, { 999499, "999 kB" }, { 999500, "1.0 MB" }, { 1000000, "1.0 MB" }, { 952500000, "952 MB" }, { 952500001, "953 MB" }, { 1000000000, "1.0 GB" }, { 2300000000000ULL, "2.3 TB" }, { 9700000000000000ULL, "9.7 PB" }


Para convertir el tamaño de archivo a MB, Gb use la función siguiente

- (id)transformedValue:(id)value { double convertedValue = [value doubleValue]; int multiplyFactor = 0; NSArray *tokens = @[@"bytes",@"KB",@"MB",@"GB",@"TB",@“PB”, @“EB”, @“ZB”, @“YB”]; while (convertedValue > 1024) { convertedValue /= 1024; multiplyFactor++; } return [NSString stringWithFormat:@"%4.2f %@",convertedValue, tokens[multiplyFactor]]; }

EDITAR:

También puede usar la clase NSByteCountFormatter . Disponible en iOS 6.0 / OS X v10.8 y posterior.

[NSByteCountFormatter stringFromByteCount:1999 countStyle:NSByteCountFormatterCountStyleFile];

Puede usar NSByteCountFormatterCountStyleFile , NSByteCountFormatterCountStyleMemory , NSByteCountFormatterCountStyleDecimal o NSByteCountFormatterCountStyleBinary en countStyle.

NSByteCountFormatterCountStyleFile : especifica la visualización del archivo o el conteo de bytes de almacenamiento. El comportamiento real para esto es específico de la plataforma; en OS X 10.8, usa el estilo decimal, pero eso puede cambiar con el tiempo.

NSByteCountFormatterCountStyleMemory : especifica la visualización del recuento de bytes de memoria. El comportamiento real para esto es específico de la plataforma; en OS X 10.8, esto utiliza el estilo binario, pero eso puede cambiar con el tiempo.

NSByteCountFormatterCountStyleDecimal : especifica el número de bytes para KB explícitamente, 1000 bytes se muestran como 1 KB

NSByteCountFormatterCountStyleBinary : especifica el número de bytes para KB explícitamente, 1024 bytes se muestran como 1 KB


Si tiene como objetivo OS X 10.8 o iOS 6, puede usar NSByteCountFormatter .

Escribiría tu ejemplo así:

NSError *error = nil; NSDictionary *attribs = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error]; if (attribs) { NSString *string = [NSByteCountFormatter stringFromByteCount:[attribs fileSize] countStyle:NSByteCountFormatterCountStyleFile]; NSLog(@"%@", string); }