2010-05-05 16 views

Antwort

80

Z.B. durch ein Verzeichnis enumerator mit:

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); 
    } 
} 

Swift

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

Vergessen Sie nicht zu überprüfen, ob 'removeItemAtPath:' tatsächlich fehlgeschlagen ist, bevor Sie versuchen, das Fehlerobjekt zu verwenden. Zumindest können Sie mehr Fehler melden, als Sie tatsächlich haben. –

+0

@Peter: Ups, danke. –

+0

Es gibt ein Problem in Ihrer while-Schleife, Sie können die Variable nicht innerhalb der while-Schleife deklarieren !! – Psycho

10

Versuchen Sie folgendes:

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 :: braucht' nicht geben Ihnen den vollständigen Pfad des Inhalts. –

+0

Es besteht keine Notwendigkeit für "." oder ".." seit 'contentsOfDirectoryAtPath: error' _filters_ out; aus docs ** Die Suche ist seicht und gibt daher den Inhalt von Unterverzeichnissen nicht zurück. Dieses zurückgegebene Array enthält keine Zeichenfolgen für das aktuelle Verzeichnis ("."), Übergeordnetes Verzeichnis ("..") oder Ressourcenzweige (beginnt mit "._") und durchläuft keine symbolischen Links. ** – petert

+0

@petert Whoa Das ist eine sehr alte Antwort. Danke für die Information. –

2

Die Dokumentation für contentsOfDirectoryAtPath:error: sagt:

Die Suche flach ist und somit nicht den Inhalt aller Unterverzeichnisse zurückgibt. Dieses zurückgegebene Array enthält keine Zeichenfolgen für das aktuelle Verzeichnis ("."), Das übergeordnete Verzeichnis ("..") oder Ressourcenzweige (beginnt mit "._") und durchläuft keine symbolischen Verknüpfungen.

So:

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

ist irrelevant.

0

Warum nicht das gesamte Verzeichnis löschen und danach neu erstellen? Rufen Sie die Dateiattribute und Berechtigungen ab, bevor Sie sie löschen, und erstellen Sie sie anschließend mit denselben Attributen neu.

+1

Warum möchten Sie den Ordner entfernen und auf mögliche Probleme (z. B. Berechtigungen) stoßen, wenn Sie nur den Inhalt entfernen können? –

+1

Es ist oft besser, ein Verzeichnis zu scannen und Dateien aus dem Quellcode zu entfernen, da es weitaus zuverlässiger ist, Fehler zu beheben und zu melden. – petert

1

Georg Fritzsche Antwort für Swift funktionierte nicht für mich. Anstatt das aufgezählte Objekt als String zu lesen, lesen Sie es als NSURL.

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

Sie können die NSFileManager wie folgt erweitern:

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

Dann Sie den Ordner wie folgt löschen können: NSFileManager.defaultManager().clearFolderAtPath("the folder's path")

5

in swift 2.0:

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

Swift 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

Swift 3, wenn jemand es für einen schnellen Ausschneiden/Einfügen

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) 
    } 
} 
Verwandte Themen