NSFileManager removeItemAtURL
仅执行递归删除。对于非空目录没有特殊处理。
如何通过预先测试条件来仅删除空目录?有
contentsOfDirectoryAtPath
可以获取文件列表,该列表可能是空的,但这太过分了。
或者,是否有一个函数可以仅在为空时将其删除,例如good ol'
rmdir
?啊,我可以这么称呼……
如果你想留在基金会土地上,就必须使用它,没有其他办法。
但是,如果这样做,就会引入竞争条件:在列出目录的内容之后和删除它之前,其他程序可能会在那里写入一个新文件,然后该文件会被删除。因此,您必须接受这样一个事实:您正在删除文件夹(包括其所有内容),或者您必须寻找不同的 API。
您可以使用 POSIX
rmdir
函数来实现您的目标,如下所示:
NSString *path = [url path];
int result = rmdir( [path fileSystemRepresentation] );
if (result == 0) // everything ok
else // lookup error code from errno
如果目录不为空,您会收到错误代码
ENOTEMPTY
。
这并不过分……如果你想要一个类似
- isEmptyDirectoryAtURL:
的方法,就去做吧:
@interface NSFileManager (EmptyDirectoryAtURL)
- (BOOL)isEmptyDirectoryAtURL:(NSURL*)url;
@end
@implementation NSFileManager (EmptyDirectoryAtURL)
- (BOOL)isEmptyDirectoryAtURL:(NSURL*)url
{
// This assumes you know the URL you have is actually a
// directory and should be enhanced to ensure that
return ([[self contentsOfDirectoryAtURL:url includingPropertiesForKeys:nil options:0 error:NULL] count] <= 1);
}
@end
为什么不实现 NSFileManager 委托方法 “
fileManager:shouldRemoveItemAtURL:
” 并在该委托方法实现中,快速检查一下 A)该项目是否是一个目录,B)在返回“YES
”之前该目录是否为空”.
if let k = try? FileManager.default
.contentsOfDirectory(at: dd, includingPropertiesForKeys: nil),
k.isEmpty {
.. the directory is empty
}