NSURL

2009-12-18 13 views
68

का उपयोग कर फ़ाइल अस्तित्व का परीक्षण करना हिम तेंदुए ने NSURL ऑब्जेक्ट्स का उपयोग करने के लिए कई नए तरीकों की शुरुआत की, ताकि पथों या कोर सेवा 'एफएसआरफ्स' को संदर्भित किया जा सके।NSURL

हालांकि, एक कार्य है जिसके लिए मुझे एक यूआरएल-आधारित विधि नहीं मिल रही है: परीक्षण करना कि फ़ाइल मौजूद है या नहीं। मैं -[NSFileManager fileExistsAtPath:] का यूआरएल-आधारित संस्करण ढूंढ रहा हूं। उस विधि की तरह, अगर 0 यूआरएल कुछ भी बताता है, तो यह YES वापस आना चाहिए, भले ही यह एक नियमित फ़ाइल, निर्देशिका, या कुछ और हो।

मैं विभिन्न resource values को देखने का प्रयास कर सकता हूं, लेकिन उनमें से कोई भी स्पष्ट रूप से मौजूद नहीं है अगर फ़ाइल नहीं है, और उनमें से कुछ (उदा।, NSURLEffectiveIconKey) महंगा हो सकता है।

मैं केवल NSFileManager के fileExistsAtPath: का उपयोग कर सकता हूं, लेकिन यदि कोई और आधुनिक विधि है, तो मैं इसका उपयोग करना पसंद करूंगा।

क्या कोको, सीएफ, या कोर सेवाओं में एक साधारण विधि या कार्य है जो मुझे यह बताने के लिए गारंटी/दस्तावेज है कि क्या दी गई फ़ाइल (या फ़ाइल-संदर्भ) यूआरएल एक फ़ाइल-सिस्टम ऑब्जेक्ट को संदर्भित करता है या नहीं?

उत्तर

130

NSURL इस विधि का उपयोग करता है: "। रिटर्न कि क्या संसाधन एक फ़ाइल यूआरएल द्वारा की ओर इशारा किया पहुँचा जा सकता है"

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error 

कौन सा

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
       isDirectory:NO]; 
NSError *err; 
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO) 
    [[NSAlert alertWithError:err] runModal]; 
+3

किसी भी आईफोन ओएस देव को इस उत्तर से फेंक दिया गया है: 'चेक रिसोर्स IReachableAndReturnError:' केवल 10.6 में उपलब्ध है और बाद में और आईफोन एसडीके में अभी तक उपलब्ध नहीं है। –

+4

अपडेट: यह आईओएस 4 के रूप में उपलब्ध है। –

+2

एक्सकोड 3.2.5 में आईओएस दस्तावेज़ (जो आईओएस 4.2 का समर्थन करता है) राज्य: "यह विधि आईओएस में अनुपूरक है, इसलिए यह कोई ऑपरेशन नहीं करता है।" – Daniel

1

क्योंकि NSURL स्थानीय फ़ाइल-सिस्टम को अधिक प्रतिनिधित्व कर सकता है, मुझे नहीं लगता कि एक सामान्य विधि है जो विश्वसनीय रूप से उनके अस्तित्व के लिए परीक्षण कर सकती है। कम से कम, कोको नींव में ऐसा कोई कार्य नहीं है (जहां तक ​​मुझे पता है)।

यदि आप केवल स्थानीय फ़ाइल-सिस्टम से निपटते हैं, तो मैं आपको NSURL या NSFileManager के लिए urlExists: संदेश के साथ एक श्रेणी बनाने का सुझाव देता हूं। यह NSURL को NSString (सामान्यीकृत पथ) में परिवर्तित करेगा और फिर [NSFileManager fileExistsAtPath:] संदेश का आह्वान करेगा।

+0

आप उपर्युक्त 'चेक रिसोर्स IReachableAndReturn को जोड़ सकते हैं त्रुटि: 'sileFileURL' के साथ इसे निष्क्रिय रखने के लिए। –

2

यदि किसी विशेष फ़ाइल (या फ़ाइल-संदर्भ) यूआरएल एक फ़ाइल-प्रणाली उद्देश्य यह है कि मौजूद है को संदर्भित करता है दूरदराज के संसाधनों के लिए स्वाभाविक महंगा है निर्धारण, 10.6 केवल (कोई iPhoneOS) API इस CFURLResourceIsReachable (के लिए) और [ NSURL checkResourceIsReachableAndReturnError:] दोनों सिंक्रोनस हैं, भले ही आप उनका उपयोग करेंगे, कई फाइलों के लिए आप अभी भी एक महत्वपूर्ण देरी ओवरहेड देख रहे होंगे।

आपको क्या करना चाहिए कैशिंग के साथ अपने स्वयं के एसिंक्रोनस जांच दिनचर्या को लागू करना है जो अलग-अलग संसाधनों की सूची बनाता है।

अन्यथा CFURLResourceIsReachable के लिए नोट हैडर राज्य में:

An example would be periodic maintenance of UI state that depends on the existence of a particular document. When performing an operation such as opening a file, it is more efficient to simply try the operation and handle failures than to check first for reachability.

+1

मुझे संदेह है कि यह धीमा है ... NSURL एचएफएस + फाइल सिस्टम प्रविष्टि का एक लिंक रखता है जो यह दर्शाता है। ऐप्पल के अनुसार, यूआरएल सभी फाइल सिस्टम संचालन के लिए पथों की तुलना में * अधिक * तेज हैं। –

29

आईओएस मैं किसी अन्य तरीके से नहीं मिल सका पर ...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...} 
9

यहाँ स्विफ्ट 2 जवाब है:

var error:NSError? 
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error) 
+0

यह 'RRRourceIsReachable() -> शून्य 'होना चाहिए और अपवाद फेंकना चाहिए, हालांकि, आपने जो कहा वह Xcode 7.x –

+0

* फेंक त्रुटि के लिए सही है। स्विफ्ट त्रुटियां उद्देश्य-सी अपवादों से अलग हैं। इसी तरह के वाक्यविन्यास, लेकिन अलग उद्देश्य। –

संबंधित मुद्दे