2010-02-09 3 views

risposta

111
NSFileManager *fm = [NSFileManager defaultManager]; 
NSString *directory = [[self documentsDirectory] stringByAppendingPathComponent:@"Photos/"]; 
NSError *error = nil; 
for (NSString *file in [fm contentsOfDirectoryAtPath:directory error:&error]) { 
    BOOL success = [fm removeItemAtPath:[NSString stringWithFormat:@"%@%@", directory, file] error:&error]; 
    if (!success || error) { 
     // it failed. 
    } 
} 

Lascio a voi di fare qualcosa di utile con l'errore se esiste.

+1

@ m1neral: questo dovrebbe essere un commento, non una modifica – abatishchev

+0

L'ho riavvolto perché non era corretto comunque. – coneybeare

+20

In generale, dovresti probabilmente usare 'stringByAppendingPathComponent' invece di' stringWithFormat' per concatenare i percorsi. (Conosco i suddetti lavori, ma solo a causa della barra finale codificata in '@" Foto/"'.) – zekel

16

se si desidera rimuovere i file e le directory in sé quindi utilizzarlo senza for ciclo

NSFileManager *fm = [NSFileManager defaultManager]; 
NSString *directory = [[self documentsDirectory] stringByAppendingPathComponent:@"Photos"]; 
NSError *error = nil; 
BOOL success = [fm removeItemAtPath:cacheImageDirectory error:&error]; 
if (!success || error) { 
    // something went wrong 
} 
12

stesso per gli amanti veloci:

let fm = FileManager.default 
do { 
    let folderPath = "...my/folder/path" 
    let paths = try fm.contentsOfDirectory(atPath: folderPath) 
    for path in paths 
    { 
    try fm.removeItem(atPath: "\(folderPath)/\(path)") 
    } 
} catch { 
    print(error.localizedDescription) 
} 
+0

ha lavorato per me, grazie solo bisogno di un po 'di modifica, grazie –

0

Swift 4

do { 

     let destinationLocation:URL = ... 

     if FileManager.default.fileExists(atPath: destinationLocation.path) { 
      try! FileManager.default.removeItem(at: destinationLocation) 
     } 

    } catch { 
    print("Error \(error.localizedDescription)") 
    } 
+0

Non dovrebbe essere forza dopo prova, se stai usando catch. Inoltre, stai cercando di rimuovere il file per URL, non tutti i file per percorso. –

+0

Da Apple: "Si sconsiglia di tentare di prevedere il comportamento in base allo stato corrente del file system o di un particolare file sul file system", il che significa che non si deve controllare se il file esiste prima di rimuoverlo. Dovresti semplicemente provare ad eliminare il file e quindi gestire l'errore in modo appropriato. Controlla [la documentazione] (https://developer.apple.com/documentation/foundation/filemanager/1415645-fileexists) su 'fileExists (atPath:)' per maggiori informazioni. – strikerdude10

0

Molte delle risposte più vecchie hanno utilizzato contentsOfDirectoryAtPath:error: che funzionerà, ma according to Apple:

"The preferred way to specify the location of a file or directory is to use the NSURL class"

quindi se si desidera utilizzare NSURL invece è possibile utilizzare il metodo contentsOfDirectoryAtURL:includingPropertiesForKeys:options:error: quindi sarebbe simile a questa:

NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSArray<NSURL*> *urls = [fileManager contentsOfDirectoryAtURL:directoryURL includingPropertiesForKeys:@[NSURLNameKey, NSURLIsDirectoryKey] options:NSDirectoryEnumerationSkipsHiddenFiles error:nil]; 

    for (NSURL *url in urls) 
    { 
     NSError *error = nil; 
     BOOL success = [fileManager removeItemAtURL:url error:error]; 
     if (!success || error) { 
      // something went wrong 
     } 
    }