2010-05-05 2 views

ответ

80

Э.Г. с помощью каталога нумератор:

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

Не забудьте проверить, действительно ли 'removeItemAtPath:' не удалось выполнить попытку использования объекта ошибки. По крайней мере, вы можете сообщить больше ошибок, чем есть на самом деле. –

+0

@Peter: Ой, спасибо. –

+0

В вашем цикле while есть проблема, вы не можете объявить переменную внутри круглых скобок! – Psycho

10

Попробуйте это:

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 ::' не дает вам полный путь к содержимому. –

+0

Нет необходимости тестировать «.». или "..", поскольку 'contentOfDirectoryAtPath: error' _filters_ их; from docs ** Поиск неглубокий и, следовательно, не возвращает содержимое каких-либо подкаталогов. Этот возвращенный массив не содержит строк для текущего каталога («.»), Родительского каталога («..») или вилки ресурсов (начинаются с «._») и не пересекает символические ссылки. ** – petert

+0

@petert Whoa , это очень старый ответ. Спасибо за информацию. –

2

Документация contentsOfDirectoryAtPath:error: говорит:

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

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

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

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

0

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

+1

Зачем вам удалять папку и запускать возможные проблемы (например, разрешения), если вы можете просто удалить ее содержимое? –

+1

Часто лучше сканировать каталог и удалять файлы из исходного кода, так как гораздо надежнее восстанавливать и сообщать об ошибках. – petert

1

Ответ Georg Fritzsche для Swift не работал для меня. Вместо чтения перечисленного объекта как строки, прочитайте его как 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

Вы можете продлить NSFileManager так:

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's path")

5

в скор 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, если кто нуждается в ней для быстрой резки/вставки

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) 
    } 
} 
Смежные вопросы