33

यदि कोई अस्तित्व नहीं है तो मुझे निर्देशिका बनाने का यह तरीका मिला है। लेकिन यह थोड़ा गड़बड़ दिखता है और मुझे डर है कि यह 1000 प्रयासों में से 1 में गलत हो सकता है।यदि कोई निर्देशिका नहीं है तो निर्देशिका बनाने का कोई सुरक्षित तरीका है?

if(![[NSFileManager defaultManager] fileExistsAtPath:bundlePath]) { 
    [[NSFileManager defaultManager] createDirectoryAtPath:bundlePath withIntermediateDirectories:YES attributes:nil error:NULL]; 
} 

केवल यह अजीब विधि फ़ाइल है ExxAtPath जो फाइलों और न केवल निर्देशिकाओं को देखता है। लेकिन मेरे लिए, खतरनाक बात यह है: क्या होगा यदि यह गलत हो जाए? मैं क्या करूँ? यह गारंटी देने के लिए सबसे अच्छा अभ्यास क्या है कि निर्देशिका बनाई गई है, और केवल तभी बनाई गई जब यह अस्तित्व में न हो?

मुझे पता है कि फाइल सिस्टम ऑपरेशन कभी सुरक्षित नहीं हैं। डिवाइस अचानक उस समय बैटरी की बैटरी को खो सकता है जहां उसने ए से बी तक बिट्स को घुमाया था या यह एक बुरे बिट पर ठोकर खा सकता है और एक सेकंड के लिए लटका सकता है। शायद कुछ ही मामलों में यह कोई निर्देशिका नहीं होने पर भी हाँ देता है। सीधे शब्दों में कहें: मुझे फाइल सिस्टम ऑपरेशंस पर भरोसा नहीं है।

मैं इसे बिल्कुल सुरक्षित कैसे बना सकता हूं?

उत्तर

66

आप वास्तव में if को छोड़ सकते हैं, भले ही एप्पल के डॉक्स का कहना है कि निर्देशिका मौजूद नहीं चाहिए, जो केवल सच है अगर आप withIntermediateDirectories:NO

कहते हैं कि एक कॉल करने के लिए नीचे से गुजर रहे हैं। अगले कदम के लिए किसी भी त्रुटि के कब्जा करने के लिए है:

NSError * error = nil; 
[[NSFileManager defaultManager] createDirectoryAtPath:bundlePath 
          withIntermediateDirectories:YES 
              attributes:nil 
               error:&error]; 
if (error != nil) { 
    NSLog(@"error creating directory: %@", error); 
    //.. 
} 

यह होगा एक त्रुटि में नहीं परिणाम अगर निर्देशिका पहले से मौजूद।

+0

बढ़िया! अगर कोई त्रुटि होती है तो मुझे क्या करना चाहिए? क्या यह कोशिश करने और फिर कोशिश करने के लिए समझ में आता है? (कम से कम कुछ बार ...? और क्या होगा यदि इससे मदद नहीं मिलती?) – dontWatchMyProfile

+0

मुझे यकीन नहीं है कि कोई त्रुटि होने पर क्या करना है। यह निर्भर करता है कि आप कितना फैंसी प्राप्त करना चाहते हैं। आप विशिष्ट त्रुटियों की तलाश कर सकते हैं और उन्हें अलग-अलग संभाल सकते हैं, या एक अलग पथ बनाने की कोशिश कर सकते हैं। शायद उपयोगकर्ता को एक अलग चुनने दें? –

+5

आपको रिटर्न वैल्यू की जांच करने की आवश्यकता है, त्रुटि सूचक नहीं – Sven

3
NSFileManager *fileManager= [NSFileManager defaultManager]; 
if(![fileManager fileExistsAtPath:directory isDirectory:&isDir]) 
    if(![fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:NULL]) 
     NSLog(@"Error: Create folder failed %@", directory); 

एक SO विषय here से।

निर्देशिका बनाने के बाद, आप फ़ाइल सिस्टम को फ्लश कर सकते हैं और फिर यह देखने के लिए जांचें कि क्या आपकी नव निर्मित निर्देशिका मौजूद है या नहीं। यह शायद अधिक है, लेकिन आप कभी ज्यादा ज्यादा नहीं हो सकता है।

+0

के लिए आप "फाइल सिस्टम फ्लश" से क्या मतलब है? – dontWatchMyProfile

+0

dontWatchMyProfile: डिस्क पर लिखता है (या इस मामले में, फ्लैश स्टोरेज) अक्सर पहले बहुत तेज़ रैम पर लिखा जाता है, फिर मुख्य स्टोरेज को प्रदर्शन और लोड अनुमति के रूप में प्रतिबद्ध किया जाता है। उस कैश को फ़्लश करना, या "सिंकिंग", सिस्टम को "कैश की पूरी सामग्री को अभी लिखने" के लिए आदेश देता है। यह महत्वपूर्ण है, क्योंकि ओपी कहता है, बिजली खो जाती है। मेरे पास आईफोन और संबंधित उपकरणों पर फ़ाइल आईओ के बारे में बहुत कम जानकारी है, लेकिन एक उम्मीदवार प्रासंगिक एसओ थ्रेड यहां मौजूद है: http://stackoverflow.com/questions/459537/clear-buffer-cache-on-mac-os-x –

+2

लाइन दो और लाइन तीन के बीच आपको इस तरह की एक टिप्पणी जोड़नी चाहिए: // ठीक है, हम प्रक्रियाओं को स्विच करते हैं और कोई और उस फ़ाइल के साथ फाइल बना सकता है जिसे हमने अभी फाइल पर पास किया है एक्स्टिस्ट्सएपपाथ: isDirectory: - तो यह चेक वास्तव में लायक नहीं है करते हुए। –

1

तेज 2 यह इस तरह दिखता है:

do { 
    try NSFileManager.defaultManager().createDirectoryAtPath(pathURL.absoluteString, withIntermediateDirectories: true, attributes: nil) 
} catch { 
    print(error) 
} 
4

स्विफ्ट 3,0

do { 
    try FileManager.default.createDirectory(atPath: folder, withIntermediateDirectories: true, attributes: nil) 
} catch { 
    print(error) 
}