如何在不删除目录本身的情况下删除目录的所有内容?我想基本上清空一个文件夹,但保持它(和权限)完好无损。NSFileManager删除目录的内容
回答
例如使用目录枚举:
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)
}
试试这个:
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...
}
}
'contentsOfDirectoryAtPath ::'不给你的内容的完整路径。 – 2010-05-05 01:43:56
没有必要测试“。”或“..”,因为“contentsOfDirectoryAtPath:error'_filters_filters_ out;来自docs **搜索很浅,因此不会返回任何子目录的内容。返回的数组不包含当前目录(“。”),父目录(“..”)或资源分支(以“._”开头)的字符串,并且不会遍历符号链接。** – petert 2011-11-24 10:55:43
@petert Whoa ,这是一个非常古老的答案。谢谢(你的)信息。 – 2011-11-24 10:59:39
的文档contentsOfDirectoryAtPath:error:
说:
搜索较浅,因此不返回任何子目录的内容。返回的数组不包含当前目录(“。”),父目录(“..”)或资源分支(以“._”开头)的字符串,并且不会遍历符号链接。
因此:
---(file != @"." && file != @"..")---
是无关紧要的。
为什么不删除整个目录然后重新创建?在删除它之前,只需获取文件属性和权限,然后使用相同的属性重新创建它。
为什么要删除该文件夹并遇到可能的问题(例如,权限),如果您只能删除它的内容? – 2011-07-19 14:03:17
扫描目录并从源代码中删除文件通常会更好,因为恢复和报告错误要可靠得多。 – petert 2011-11-24 11:10:24
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)
}
可以扩展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")
在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")
}
}
}
斯威夫特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如果有人需要它的快速剪切/粘贴
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)
}
}
- 1. 如何使用NSFileManager删除目录及其内容
- 2. PHP删除目录的内容
- 3. 用CURL删除FTP目录内容
- 4. 删除目录结构,但保留目录内容
- 5. 在内部,如何删除目录的内容,但不是目录本身?
- 6. NSFilemanager和安全删除
- 7. 用于删除文件/目录和报告删除内容的MSBuild语法
- 8. 删除标签的内容 - 目标C
- 9. 如何删除Documents目录的内容(而不是Documents目录本身)?
- 10. 如何使用ftw删除目录的内容
- 11. 从C#中的FTP服务器中删除目录内容
- 12. 庆典 - 删除目录(包括其内容)的列表
- 13. 删除目录
- 14. 删除目录
- 15. 删除目录
- 16. 删除目录
- 17. 在PowerShell中删除目录对象及其内容
- 18. 在Linux中删除内容但不是目录?
- 19. 使用厨师只删除目录内容
- 20. 无论内容如何,基于创建日期删除目录
- 21. 根据其内容删除项目
- 22. 删除iCloud容器内容
- 23. 删除目录不看内部
- 24. 删除MSBuild中除一个隐藏目录以外的目录中的所有内容
- 25. 删除VSMacros80目录
- 26. 删除目录名
- 27. HDFS:删除目录
- 28. Git删除目录
- 29. 删除Excel的内容C#
- 30. 删除PlaceHolderPageTitleInTitleArea的内容
在尝试使用错误对象之前,不要忘记检查'removeItemAtPath:'是否实际失败。至少,你可能会报告比实际情况更多的错误。 – 2010-05-08 03:35:32
@彼得:哎呀,谢谢。 – 2010-05-08 04:16:21
你的while循环有个问题,你不能在括号内声明你的变量! – Psycho 2011-07-19 13:36:01