Pregunta

¿Hay una manera de conseguir cadena legible por humanos (@ "drwxr-xr-x", por ejemplo) a partir de un número entero NSFilePosixPermissions?

¿Fue útil?

Solución

El atributo de archivo permisos del sistema es simplemente un valor de largo sin signo. El código siguiente, obviamente, podría hacerse más eficiente, pero se nota [más o menos] lo que hay que hacer para obtener la cadena que desea:

// The indices of the items in the permsArray correspond to the POSIX
// permissions. Essentially each bit of the POSIX permissions represents
// a read, write, or execute bit.
NSArray *permsArray = [NSArray arrayWithObjects:@"---", @"--x", @"-w-", @"-wx", @"r--", @"r-x", @"rw-", @"rwx", nil];
NSFileManager *fm = [[[NSFileManager alloc] init] autorelease];
NSMutableString *result = [NSMutableString string];
NSDictionary *attrs = [fm attributesOfItemAtPath:@"some/path.txt" error:NULL];

if (!attrs)
    return nil;

NSUInteger perms = [attrs filePosixPermissions];

if ([[attrs fileType] isEqualToString:NSFileTypeDirectory])
    [result appendString:@"d"];
else
    [result appendString:@"-"];

// loop through POSIX permissions, starting at user, then group, then other.
for (int i = 2; i >= 0; i--)
{
    // this creates an index from 0 to 7
    unsigned long thisPart = (perms >> (i * 3)) & 0x7;

    // we look up this index in our permissions array and append it.
    [result appendString:[permsArray objectAtIndex:thisPart]];
}

return result;

Otros consejos

Bueno, yo supongo que se puede crear una matriz de este modo:

NSArray *convertToAlpha = [NSArray arrayWithObjects:@"---",@"--x",@"-w-",@"--wx",@"r--",@"r-x",@"rw-",@"rwx", nil];

A continuación, después de tranlating los NSFilePosixPermissions a octal, dividir el número resultante en sus dígitos componenete y utilizar convertToAlpha para mapear cada dígito a su representación alfanumérica ....

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