2009-10-26 6 views

Respuesta

13
+0

- [NSFileManager attributesOfFileSystemForPath: Error:] no devuelve un diccionario con la clave NSFileSystemFreeSize en ella. – zekel

+1

Whoops, tenías razón. Parece que lo intenté en la clase, no en la instancia. – zekel

+0

Hola, ¿qué ocurre si una de las subcarpetas en la ruta apunta a otro sistema de archivos, sabe NSFileManager que la ignorará al recuperar los atributos? – Zohar81

9

EDITAR fileSystemAttributesAtPath: es obsoleto, el uso attributesOfFileSystemForPath: error: como sugiere NSD. Cometí un error cuando pensé que no funcionaba.

// this works 
NSError *error = nil; 
NSDictionary *attr = [NSFM attributesOfFileSystemForPath:@"/" error:&error]; 
if (!error) { 
    double bytesFree = [[attr objectForKey:NSFileSystemFreeSize] doubleValue]; 
} 

yo probamos este, attributesOfItemAtPath: error pero el dict devueltos no parecen tener la clave NSFileSystemFreeNodes.

NSFileManager *fm = [NSFileManager defaultManager]; 
NSError *error = nil; 
NSDictionary *attr = [fm attributesOfItemAtPath:@"/" error:&error]; 
if (!error) { 
    NSLog(@"Attr: %@", attr); 
} 

2009-10-28 17:21:11.936 MyApp[33149:a0b] Attr: { 
    NSFileCreationDate = "2009-08-28 15:37:03 -0400"; 
    NSFileExtensionHidden = 0; 
    NSFileGroupOwnerAccountID = 80; 
    NSFileGroupOwnerAccountName = admin; 
    NSFileModificationDate = "2009-10-28 15:22:15 -0400"; 
    NSFileOwnerAccountID = 0; 
    NSFileOwnerAccountName = root; 
    NSFilePosixPermissions = 1021; 
    NSFileReferenceCount = 40; 
    NSFileSize = 1428; 
    NSFileSystemFileNumber = 2; 
    NSFileSystemNumber = 234881026; 
    NSFileType = NSFileTypeDirectory; 
} 

Después looking around a bit, parece que fileSystemAttributesAtPath: es el método que devuelve. Extraño.

NSFileManager *fm = [NSFileManager defaultManager]; 
NSDictionary *attr = [fm fileSystemAttributesAtPath:@"/"]; 
NSLog(@"Attr: %@", attr); 


2009-10-28 17:24:07.993 MyApp[33283:a0b] Attr: { 
    NSFileSystemFreeNodes = 5027061; 
    NSFileSystemFreeSize = 20590841856; 
    NSFileSystemNodes = 69697534; 
    NSFileSystemNumber = 234881026; 
    NSFileSystemSize = 285481107456; 
} 
+0

"... use attributesOfFileSystemForPath: error: en su lugar." Eso es lo que sugirió NSD, y le dijiste que no funcionaba. ¿Funciona ahora? –

+0

Sí, lo hace. Parece que cometí un error antes. – zekel

+2

Dos críticas: 'error:' los parámetros toman un puntero a un puntero a un objeto, 'NSError **'. Por lo tanto, la constante del puntero nulo correcta no es 'nil' (que sería un puntero a un objeto, ya sea' * 'o' id'), es 'NULL'. Más importante aún, no suprima el error return-pass un puntero a una variable allí, e informe el error si (y solo si) falla el intento de recuperar atributos.La falla silenciosa es mala. –

7

utilizo este:

NSDictionary* fileAttributes = [[NSFileManager defaultManager] attributesOfFileSystemForPath:@"/" 
                        error:&error]; 
unsigned long long freeSpace = [[fileAttributes objectForKey:NSFileSystemFreeSize] longLongValue]; 
NSLog(@"free disk space: %dGB", (int)(freeSpace/1073741824)); 
+0

Código perfecto! Funciona como encanto! Muchas gracias por compartir. :) – zeFree

+0

Mis 2 centavos - 1) usa un NSString que contiene la ruta a un volumen en lugar de @ "/" para ver información de otros volúmenes. 2) sería mejor si usamos unsignedLongLongValue en lugar de longLongValue. – zeFree

-1

fabricantes de dispositivos de disco duro, utilice:

1 GB = 1000 MB

1 MB = 1000 KB etc.

Si ves una memoria USB de 8GB en Windows siempre muestra menos espacio que real (como 7,8 GB) porque se considera 1 GB = 1024 MB). En OSX, el mismo dispositivo USB es de 8 GB (real).

por lo (freeSpace/1073741824) debe haber (freeSpace/1000000000)

al menos en OSX

+0

Para quienes han votado a favor, los invito a mirar el vocabulario griego para el significado de giga, mega, etc. – Mike97

+0

Su respuesta es trivia buena y potencialmente útil, pero no responde la pregunta que se hizo. –

+0

Gracias Michael, estoy muy bien con esto (es decir, si mi comentario es OT), pero lamentablemente las respuestas aquí fueron simplemente erróneas si se tiene en cuenta la etiqueta de cacao + disco duro. Mi respuesta contiene implícitamente una corrección al código ya publicado (eso debería estar bien ya que no es una mejora sino una corrección). Entonces, si quieres encontrar el espacio correcto, debes usar múltiplo de 1000 en lugar de 1024, de lo contrario el resultado será incorrecto, también porque el cacao ya lo usa. – Mike97

0

obtener de this post:

- (uint64_t)freeDiskspace 
{ 
    uint64_t totalSpace = 0; 
    uint64_t totalFreeSpace = 0; 

    __autoreleasing NSError *error = nil; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSDictionary *dictionary = [[NSFileManager defaultManager] attributesOfFileSystemForPath:[paths lastObject] error: &error]; 

    if (dictionary) { 
     NSNumber *fileSystemSizeInBytes = [dictionary objectForKey: NSFileSystemSize]; 
     NSNumber *freeFileSystemSizeInBytes = [dictionary objectForKey:NSFileSystemFreeSize]; 
     totalSpace = [fileSystemSizeInBytes unsignedLongLongValue]; 
     totalFreeSpace = [freeFileSystemSizeInBytes unsignedLongLongValue]; 
     NSLog(@"Memory Capacity of %llu MiB with %llu MiB Free memory available.", ((totalSpace/1024ll)/1024ll), ((totalFreeSpace/1024ll)/1024ll)); 
    } else { 
     NSLog(@"Error Obtaining System Memory Info: Domain = %@, Code = %d", [error domain], [error code]); 
    } 

    return totalFreeSpace; 
} 

La principal diferencia es que se debe utilizar NSSearchPathForDirectioriesInDomains, de lo contrario me estaba poniendo valor correcto en el simulador , pero en la carpeta del dispositivo '/' la referencia me devuelve algo así como 190MB que no era correcto.

1

A través rápida se puede obtener espacio libre mediante el uso de esta función

func getFreeSpace() -> CGFloat { 
     do { 
     let fileAttributes = try NSFileManager.defaultManager().attributesOfFileSystemForPath("/") 
     if let size = fileAttributes[NSFileSystemFreeSize] as? CGFloat { 
      return size 
     } 
     } catch { } 
     return 0 
    } 
+2

No publiques respuestas múltiples con el mismo contenido. Ya has publicado esto aquí http://stackoverflow.com/a/36654477/1743880. Publique una buena respuesta y marque la otra como duplicada. – Tunaki

Cuestiones relacionadas