NSFileManager removeItemAtURL
只执行递归删除。对非空目录没有特殊处理。
如何通过事先测试条件仅删除空目录?有contentsOfDirectoryAtPath
一个文件列表,它可能是空的,但这是矫枉过正的。
或者,是否有一个功能可以仅在为空时将其删除,例如 good ol' rmdir
?啊,我可以这样称呼……</p>
NSFileManager removeItemAtURL
只执行递归删除。对非空目录没有特殊处理。
如何通过事先测试条件仅删除空目录?有contentsOfDirectoryAtPath
一个文件列表,它可能是空的,但这是矫枉过正的。
或者,是否有一个功能可以仅在为空时将其删除,例如 good ol' rmdir
?啊,我可以这样称呼……</p>
如果你想留在基金会的土地上,你必须使用它,没有其他办法。
但是如果你这样做,你就会引入一个竞争条件:在你列出目录的内容之后,在你删除它之前,一些其他程序可能会在那里写入一个新文件,然后将其删除。因此,您必须接受您正在删除包含所有内容的文件夹这一事实,或者您必须寻找不同的 API。
您可以使用 POSIXrmdir
函数来实现您的目标,如下所示:
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
”之前该目录是否为空。