2012-05-09 25 views
9

क्या कोई यह जानता है कि कोई विशेष फ़ाइल सिस्टम स्थान सैंडबॉक्स के नीचे पहुंच योग्य है या नहीं?मैक सैंडबॉक्स: परीक्षण करें कि कोई फ़ाइल सुलभ है या नहीं

मैं यह जांचना चाहता हूं कि सामान्य पावरबॉक्स नियमों के तहत कोई विशेष फ़ाइल पहुंच योग्य है या नहीं; जिसे ओपन/सेव डायलॉग इत्यादि का उपयोग कर पावर बॉक्स में पहले ही जोड़ा जा चुका है।

क्या मैं से पहले एक सैंडबॉक्स अपवाद ट्रिगर कर सकता हूं?

क्या मैं एक सैंडबॉक्स अपवाद पकड़ सकता हूं?

सादर,

फ्रैंक

+0

मुझे उत्सुकता है कि आप परीक्षण करना चाहते हैं कि कोई स्थान पहुंच योग्य है या नहीं। आम तौर पर, आप * निर्दिष्ट * एंटाइटेलमेंट में कौन से स्थान पहुंच योग्य हैं, और फिर खुले/सहेजें बॉक्स के माध्यम से अन्य फ़ाइलों तक पहुंच प्राप्त करें। –

उत्तर

9

आप एक त्वरित और आसान परीक्षण के लिए ओएस access() प्रणाली अधिकार, man access से उपयोग कर सकते हैं: unistd.h

# शामिल < >

int access (const char * path, int amode);

एक्सेस() फ़ंक्शन पथ द्वारा नामित फ़ाइल की पहुंच को अमेड द्वारा इंगित एक्सेस अनुमतियों के लिए चेक करता है। एमोड का मूल्य बिटवाई समावेशी है या चेक अनुमतियों की जांच के लिए ( पढ़ने की अनुमति के लिए R_OK, अनुमति अनुमति के लिए W_OK और निष्पादन/खोज अनुमति के लिए X_OK) या अस्तित्व परीक्षण, F_OK। पथनाम पथ के सभी घटक एक्सेस अनुमतियों (F_OK सहित) के लिए चेक किए गए हैं।

यदि पथ नहीं मिला है या यदि कोई वांछित एक्सेस मोड नहीं दिया जाएगा, तो एक -1 मान वापस कर दिया जाएगा और वैश्विक पूर्णांक चर त्रुटि को त्रुटि इंगित करने के लिए सेट किया गया है। अन्यथा, एक 0 मान वापस कर दिया जाता है।

आप बहुत इस ऑब्जेक्टिव-सी के लिए की तरह कुछ का उपयोग कर सकता है:

typedef enum 
{ 
    ReadAccess = R_OK, 
    WriteAccess = W_OK, 
    ExecuteAccess = X_OK, 
    PathExists = F_OK 
} AccessKind; 


BOOL isPathAccessible(NSString *path, AccessKind mode) 
{ 
    return access([path UTF8String], mode) == 0; 
} 
+0

पावरबॉक्स प्रतिबंधों के साथ आप यह काम कैसे जानते हैं? ये पारंपरिक यूनिक्स एक्सेस अधिकार नहीं हैं, आपको पता है ... (धारणा # 1: पथ वही होगा, धारणा # 2: विफलता प्रोग्राम को समाप्त नहीं करेगी) –

+0

ठीक है, मैंने कोशिश की और यह ठीक काम करता है। सैंडबॉक्स यूनिक्स स्तर कॉल को रोकता है और ऐसा लगता है कि चेक किसी भी सैंडबॉक्स संदेश को ट्रिगर नहीं करता है। अति उत्कृष्ट! बहुत - बहुत धन्यवाद। –

+0

@DietrichEpp - सैंडबॉक्स ओएस स्तर पर संचालित होता है; यानी "कोको, पॉजिक्स, मैक इत्यादि" नीचे "एसीएल द्वारा सैंडबॉक्स द्वारा लगाए गए प्रतिबंधों, और पारंपरिक यूनिक्स आरडब्ल्यूएक्स सेटिंग्स द्वारा 'एक्सेस()' जैसे कॉल का उपयोग करें। – CRD

2

कुछ बातें। पथ स्ट्रिंग की आवश्यकता होने पर हमेशा फ़ाइल सिस्टम सिस्टम का उपयोग करें। साथ ही, R_OK पर्याप्त है यदि आप जानना चाहते हैं कि निर्दिष्ट पथ के लिए सैंडबॉक्स में कोई छेद है या नहीं।

-(BOOL)isAccessibleFromSandbox:(NSString*)path 
{ 
    return(access(path.fileSystemRepresentation, R_OK) == 0); 
}