2010-11-08 10 views
6

Czy istnieje sposób na uzyskanie ludzkiego czytelnego ciągu (np. "Drwxr-xr-x" na przykład) z liczby całkowitej NSFilePosixPermissions?Object-c NSFilePosixPermissions do czytelnego dla człowieka NSString

+0

Nie. Całkowicie niemożliwe bez talizmanu Unicorn i całego trunku. (Zobacz Bitwise Operations: http://en.wikipedia.org/wiki/Bitwise_operation) –

+0

(Wcześniej zagłosowano na pytanie, ponieważ jest dobre i jestem smart-a **.) :-) –

+0

Dzięki Joshua ! zaakceptowana odpowiedź wydaje się być w porządku! – Vassilis

Odpowiedz

4

Atrybut uprawnień systemu plików jest po prostu długością bez znaku. Poniższy kod może być oczywiście bardziej wydajny, ale pokazuje [mniej więcej], co należy zrobić, aby uzyskać żądany ciąg znaków:

// 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; 
0

Dobrze myślę, że można utworzyć tablicę tak:

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

Następnie po tranlating z NSFilePosixPermissions do ósemkowej, podzielić uzyskaną liczbę na jej cyfr componenet i używać convertToAlpha mapować każdą cyfrę do jej reprezentacji alfanumerycznej. ...

+0

xm ... Spróbuję tego. Wrócę, jeśli to zrobię, aby opublikować całe rozwiązanie. Dziękuję Ci! – Vassilis

+0

@VassilisGr, @ennuikiller: uważaj jednak, potrzebujesz symbolu @ za każdym łańcuchem, a także musisz dodać 'nil' do swojej listy argumentów. – dreamlax

+0

@dreamlax, dzięki za poprawki! – ennuikiller

Powiązane problemy