2010-05-05 84 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); 
    } 
} 

斯威夫特

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:'是否实际失败。至少,你可能会报告比实际情况更多的错误。 – 2010-05-08 03:35:32

+0

@彼得:哎呀,谢谢。 – 2010-05-08 04:16:21

+0

你的while循环有个问题,你不能在括号内声明你的变量! – Psycho 2011-07-19 13:36:01

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 ::'不给你的内容的完整路径。 – 2010-05-05 01:43:56

+0

没有必要测试“。”或“..”,因为“contentsOfDirectoryAtPath:error'_filters_filters_ out;来自docs **搜索很浅,因此不会返回任何子目录的内容。返回的数组不包含当前目录(“。”),父目录(“..”)或资源分支(以“._”开头)的字符串,并且不会遍历符号链接。** – petert 2011-11-24 10:55:43

+0

@petert Whoa ,这是一个非常古老的答案。谢谢(你的)信息。 – 2011-11-24 10:59:39

2

的文档contentsOfDirectoryAtPath:error:说:

搜索较浅,因此不返回任何子目录的内容。返回的数组不包含当前目录(“。”),父目录(“..”)或资源分支(以“._”开头)的字符串,并且不会遍历符号链接。

因此:

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

是无关紧要的。

0

为什么不删除整个目录然后重新创建?在删除它之前,只需获取文件属性和权限,然后使用相同的属性重新创建它。

+1

为什么要删除该文件夹并遇到可能的问题(例如,权限),如果您只能删除它的内容? – 2011-07-19 14:03:17

+1

扫描目录并从源代码中删除文件通常会更好,因为恢复和报告错误要可靠得多。 – petert 2011-11-24 11:10:24

1

Georg Fritzsche对Swift的回答并不适合我。不要将枚举对象作为String读取,而应将其作为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

在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

斯威夫特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

斯威夫特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) 
    } 
}