2010-05-05 14 views

Respuesta

80

P. ej mediante el uso de un empadronador directorio:

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

No olvide comprobar si 'removeItemAtPath:' realmente falló antes de intentar usar el objeto de error. Por lo menos, puede informar más errores de los que realmente tiene. –

+0

@Peter: Ups, gracias. –

+0

¡Hay un problema en tu ciclo while, no puedes declarar tu variable dentro de los paréntesis while! – Psycho

10

Prueba esto:

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 no le da la ruta completa de los contenidos. –

+0

No es necesario realizar la prueba de "." o ".." ya que 'contentsOfDirectoryAtPath: error' _filters_ out; from docs ** La búsqueda es superficial y, por lo tanto, no devuelve el contenido de ningún subdirectorio. Esta matriz devuelta no contiene cadenas para el directorio actual ("."), El directorio padre (".."), o las bifurcaciones de recursos (comienza con "._") y no atraviesa enlaces simbólicos. ** – petert

+0

@petert Whoa , esta es una respuesta muy antigua. Gracias por la info. –

2

La documentación para contentsOfDirectoryAtPath:error: dice:

La búsqueda es poco profunda y por lo tanto no devuelve el contenido de todos los subdirectorios. Esta matriz devuelta no contiene cadenas para el directorio actual ("."), El directorio principal ("..") ni las bifurcaciones de recursos (comienza con "._") y no recorre enlaces simbólicos.

Así:

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

es irrelevante.

0

¿Por qué no eliminar todo el directorio y volver a crear después? Simplemente obtenga los atributos y permisos del archivo antes de eliminarlo, y luego recíclelo con los mismos atributos.

+1

¿Por qué querría eliminar la carpeta y encontrarse con posibles problemas (por ejemplo, permisos) si solo puede eliminar su contenido? –

+1

A menudo es mejor escanear un directorio y eliminar archivos del código fuente, ya que es mucho más confiable recuperar e informar errores. – petert

1

Georg Fritzsche La respuesta para Swift no funcionó para mí. En lugar de leer el objeto enumerado como una cadena, léalo como 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

se puede ampliar el NSFileManager así:

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

A continuación, puede borrar la carpeta de la siguiente manera: NSFileManager.defaultManager().clearFolderAtPath("the folder's path")

5

en 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 si alguien lo necesita para un corte rápido/pegar

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) 
    } 
} 
Cuestiones relacionadas