Подтвердить что ты не робот

NSFileManager удаляет содержимое каталога

Как удалить все содержимое каталога без удаления самой директории? Я хочу, чтобы в основном пустую папку, но оставить ее (и разрешения) нетронутыми.

4b9b3361

Ответ 1

например. с помощью перечислителя каталогов:

NSFileManager* fm = [[[NSFileManager alloc] init] autorelease];
NSDirectoryEnumerator* en = [fm enumeratorAtPath:path];    
NSError* err = nil;
BOOL res;

NSString* file;
while (file = [en nextObject]) {
    res = [fm removeItemAtPath:[path stringByAppendingPathComponent:file] error:&err];
    if (!res && err) {
        NSLog(@"oops: %@", err);
    }
}

Свифта

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

Попробуйте следующее:

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...
    }
}    

Ответ 3

в 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")
    }
  }
}

Ответ 4

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

Ответ 5

В документации для contentsOfDirectoryAtPath:error: указано:

Поиск неглубокий и, следовательно, не возвращает содержимое любых подкаталогов. Этот возвращенный массив не содержит строки для текущего каталога ( "." ), Родительского каталога ( ".." ) или вилки ресурсов (начинаются с "._" ) и не пересекаются с символическими ссылками.

Таким образом:

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

не имеет значения.

Ответ 6

Вы можете выполнить NSFileManage следующим образом:

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

Затем вы можете очистить папку следующим образом: NSFileManager.defaultManager().clearFolderAtPath("the folder path")

Ответ 7

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

Ответ 8

Ответ Георга Фрицше для Свифта не помог мне. Вместо чтения перечисленного объекта в виде строки, прочитайте его как 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)
}

Ответ 9

Почему бы не удалить весь каталог и впоследствии воссоздать? Просто удалите атрибуты и разрешения файлов перед их удалением, а затем заново создайте его с теми же атрибутами.