2010-05-05 13 views
31

निर्देशिका को हटाए बिना निर्देशिका की सभी सामग्री को आप कैसे हटाते हैं? मैं मूल रूप से एक फ़ोल्डर को खाली करना चाहता हूं फिर भी इसे छोड़ दें (और अनुमतियां) बरकरार रहें।NSFileManager निर्देशिका की सामग्री हटाएं

उत्तर

80

जैसे एक निर्देशिका प्रगणक का उपयोग करके:

NSFileManager *fileManager = [[NSFileManager alloc] init]; 
NSDirectoryEnumerator *enumerator = [fileManager enumeratorAtPath:path];  
NSString *file; 

while (file = [enumerator nextObject]) { 
    NSError *error = nil; 
    BOOL result = [fileManager removeItemAtPath:[path stringByAppendingPathComponent:file] error:&error]; 

    if (!result && error) { 
     NSLog(@"Error: %@", error); 
    } 
} 

स्विफ्ट

let fileManager = NSFileManager.defaultManager() 
let enumerator = fileManager.enumeratorAtURL(cacheURL, includingPropertiesForKeys: nil, options: nil, errorHandler: nil) 

while let file = enumerator?.nextObject() as? String { 
    fileManager.removeItemAtURL(cacheURL.URLByAppendingPathComponent(file), error: nil) 
} 
+2

यह जांचना न भूलें कि 'removeItemAtPath:' वास्तव में त्रुटि ऑब्जेक्ट का उपयोग करने का प्रयास करने से पहले विफल रहा है या नहीं। कम से कम, आप वास्तव में अधिक त्रुटियों की रिपोर्ट कर सकते हैं। –

+0

@ पीटर: ओह, धन्यवाद। –

+0

आपके लूप लूप में कोई समस्या है, आप थोड़ी देर के अंदर आपको चर घोषित नहीं कर सकते !! – Psycho

10

इस प्रयास करें:

NSFileManager *manager = [NSFileManager defaultManager]; 
NSString *dirToEmpty = ... //directory to empty 
NSError *error = nil; 
NSArray *files = [manager contentsOfDirectoryAtPath:dirToEmpty 
               error:&error]; 

if(error) { 
    //deal with error and bail. 
} 

for(NSString *file in files) { 
    [manager removeItemAtPath:[dirToEmpty stringByAppendingPathComponent:file] 
         error:&error]; 
    if(error) { 
     //an error occurred... 
    } 
}  
+0

'contentsOfDirectoryAtPath :: के लिए इसकी आवश्यकता है' आप सामग्री का पूरा पथ नहीं देता है। –

+0

"।" के लिए परीक्षण करने की कोई आवश्यकता नहीं है। या ".." के बाद से 'ContentOfDirectoryAtPath: त्रुटि' _filters_ उन्हें बाहर; दस्तावेज़ों से ** खोज उथला है और इसलिए किसी भी उपनिर्देशिका की सामग्री वापस नहीं करता है। इस लौटे सरणी में वर्तमान निर्देशिका ("।"), पैरेंट निर्देशिका (".."), या संसाधन कांटे ("._" से शुरू होता है) के लिए तार नहीं होते हैं और प्रतीकात्मक लिंक को पार नहीं करते हैं। ** – petert

+0

@petert Whoa , यह एक बहुत पुराना जवाब है। जानकारी के लिए धन्यवाद। –

2

प्रलेखन contentsOfDirectoryAtPath:error: के लिए कहते हैं:

खोज उथले है और इसलिए अन्य सबडायरेक्ट्रीज़ की सामग्री वापस नहीं करता है। इस लौटे सरणी में वर्तमान निर्देशिका ("।"), पैरेंट निर्देशिका (".."), या संसाधन कांटे ("._" से शुरू होता है) के लिए तार नहीं होते हैं और प्रतीकात्मक लिंक को पार नहीं करते हैं।

इस प्रकार:

---(file != @"." && file != @"..")--- 

अप्रासंगिक है।

0

क्यों संपूर्ण निर्देशिका को हटाया नहीं जाता है और बाद में फिर से बनाया जाता है? बस इसे हटाने से पहले फ़ाइल विशेषताएँ और अनुमतियां प्राप्त करें, और फिर इसे उसी विशेषताओं के साथ पुन: बनाएं।

+1

यदि आप केवल इसकी सामग्री को हटा सकते हैं तो आप फ़ोल्डर को निकालना और संभावित समस्याओं (जैसे अनुमतियां) में क्यों भागना चाहते हैं? –

+1

निर्देशिका को स्कैन करना और स्रोत कोड से फ़ाइलों को निकालना अक्सर बेहतर होता है क्योंकि यह पुनर्प्राप्ति और त्रुटियों की रिपोर्ट करने के लिए कहीं अधिक विश्वसनीय है। – petert

1

स्विफ्ट के लिए जॉर्ज फ्रित्ट्स्के का जवाब मेरे लिए काम नहीं करता था। एक स्ट्रिंग के रूप में गणना की गई वस्तु को पढ़ने के बजाय, इसे NSURL के रूप में पढ़ें।

extension NSFileManager { 
    func clearFolderAtPath(path: String) -> Void { 
     for file in subpathsOfDirectoryAtPath(path, error: nil) as? [String] ?? [] { 
      self.removeItemAtPath(path.stringByAppendingPathComponent(file), error: nil) 
     } 
    } 
} 

उसके बाद, आप इस तरह फ़ोल्डर साफ कर सकते हैं:

let fileManager = NSFileManager.defaultManager() 
let url = NSURL(string: "foo/bar") 
let enumerator = fileManager.enumeratorAtURL(url, includingPropertiesForKeys: nil, options: nil, errorHandler: nil) 
while let file = enumerator?.nextObject() as? NSURL { 
    fileManager.removeItemAtURL(file, error: nil) 
} 
2

आप NSFileManager इस तरह का विस्तार कर सकते NSFileManager.defaultManager().clearFolderAtPath("the folder's path") तेज 2.0 में

5

:

if let enumerator = NSFileManager.defaultManager().enumeratorAtPath(dataPath) { 
    while let fileName = enumerator.nextObject() as? String { 
    do { 
     try NSFileManager.defaultManager().removeItemAtPath("\(dataPath)\(fileName)") 
    } 
    catch let e as NSError { 
     print(e) 
    } 
    catch { 
     print("error") 
    } 
    } 
} 
3

स्विफ्ट 2.1.1:

public func deleteContentsOfFolder() 
{ 
    // folderURL 
    if let folderURL = self.URL() 
    { 
     // enumerator 
     if let enumerator = NSFileManager.defaultManager().enumeratorAtURL(folderURL, includingPropertiesForKeys: nil, options: [], errorHandler: nil) 
     { 
      // item 
      while let item = enumerator.nextObject() 
      { 
       // itemURL 
       if let itemURL = item as? NSURL 
       { 
        do 
        { 
         try NSFileManager.defaultManager().removeItemAtURL(itemURL) 
        } 
        catch let error as NSError 
        { 
         print("JBSFile Exception: Could not delete item within folder. \(error)") 
        } 
        catch 
        { 
         print("JBSFile Exception: Could not delete item within folder.") 
        } 
       } 
      } 
     } 
    } 
} 
2

स्विफ्ट 3 अगर कोई एक त्वरित काट/चिपका

let fileManager = FileManager.default 
let fileUrls = fileManager.enumerator(at: folderUrl, includingPropertiesForKeys: nil) 
while let fileUrl = fileUrls?.nextObject() { 
    do { 
     try fileManager.removeItem(at: fileUrl as! URL) 
    } catch { 
     print(error) 
    } 
} 
संबंधित मुद्दे