2010-11-08 26 views
6

पर उद्देश्य-सी NSFilePosixPermissions एक NSFilePosixPermissions पूर्णांक से मानव पठनीय स्ट्रिंग (उदाहरण के लिए @ "drwxr-xr-x") प्राप्त करने का कोई तरीका है?मानव-पठनीय एनएसएसटींग

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

फिर NSFilePosixPermissions ऑक्टल को tranlating के बाद, अपने componenet अंकों में जिसके परिणामस्वरूप संख्या विभाजित है और convertToAlpha का उपयोग अपने अक्षरांकीय प्रतिनिधित्व करने के लिए प्रत्येक अंक मैप करने के लिए:

+0

नहीं। यूनिकॉर्न तालिज़मैन और पूरी तरह शराब के बिना पूरी तरह असंभव है। (बिटवाई ऑपरेशंस देखें: http://en.wikipedia.org/wiki/Bitwise_operation) –

+0

(सवाल यह है कि यह एक अच्छा है और मैं एक स्मार्ट-** हूं।) :-) –

+0

धन्यवाद यहोशू ! स्वीकार्य उत्तर ठीक लगता है! – Vassilis

उत्तर

4

फ़ाइल सिस्टम अनुमतियाँ विशेषता केवल एक हस्ताक्षरित लंबी मान है। नीचे दिया गया कोड स्पष्ट रूप से अधिक कुशल बनाया जा सकता है लेकिन यह आपको दिखाए गए स्ट्रिंग को पाने के लिए [अधिक या कम] क्या करने की आवश्यकता है:

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

खैर मैं तुम्हें इतना की तरह एक सरणी बना सकते हैं लगता है। ...

+0

xm ... मैं कोशिश करूँगा। अगर मैं इसे पूरा करता हूं, तो पूरे समाधान को पोस्ट करने के लिए मैं वापस आऊंगा। धन्यवाद! – Vassilis

+0

@ वासिलिस जीआर, @ennuikiller: हालांकि सावधान रहें, आपको प्रत्येक स्ट्रिंग के पीछे '@' प्रतीक की आवश्यकता है, और आपको अपनी तर्कों की सूची में 'शून्य' जोड़ने की भी आवश्यकता है। – dreamlax

+0

@dreamlax, सुधार के लिए धन्यवाद! – ennuikiller