web-dev-qa-db-fra.com

Nsfilemanager Supprimer le contenu de l'annuaire

Comment supprimez-vous tout le contenu d'un répertoire sans supprimer le répertoire lui-même? Je veux essentiellement vider un dossier encore la laisser intacte (et les autorisations).

34
Vervious

Par exemple. En utilisant un répertoire énumérateur:

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)
}
83
Georg Fritzsche

Essaye ça:

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...
    }
}    
11
Jacob Relkin

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")
    }
  }
}
5
Max

Swift 3 Si quelqu'un en a besoin pour une coupe/pâte rapide

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)
    }
}
3
Travis M.

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.")
                    }
                }
            }
        }
    }
}
3
John Bushnell

La documentation pour contentsOfDirectoryAtPath:error: dit:

La recherche est peu profonde et ne renvoie donc pas le contenu des sous-répertoires. Ce tableau renvoyé ne contient pas de chaînes pour le répertoire actuel ("."), Répertoire parent ("..") ou des fourches de ressources (commencez par "._") et ne traverse pas les liens symboliques.

Ainsi:

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

est hors de propos.

2
Mark Perkins

Vous pouvez étendre le NSFileManager comme ceci:

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

Ensuite, vous pouvez effacer le dossier comme celui-ci: NSFileManager.defaultManager().clearFolderAtPath("the folder's path")

2
KaKa

Georg Fritzsche Réponse pour Swift= Je n'ai pas fonctionné pour moi. Au lieu de lire l'objet énuméré comme une chaîne, lisez-le comme 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)
}
1
jathu

Pourquoi ne pas supprimer l'ensemble du répertoire et recréer ensuite? Obtenez simplement les attributs de fichier et les autorisations avant de la supprimer, puis de la recréer avec les mêmes attributs.

0
Psycho