NSFileManager removeItemAtURL
仅执行递归删除。非空目录没有特殊处理。
如何通过事先测试条件来删除空目录?有contentsOfDirectoryAtPath
来获取文件列表,这些文件可能是空的,但这太过分了。
或者,是否有一个函数只有在空的情况下将其删除,就像好的rmdir
一样?啊,我可以称之为......
答案 0 :(得分:6)
你必须使用它,如果你想留在基金会的土地,没有别的办法。
但是如果你这样做,你会引入竞争条件:在列出目录的内容之后,在删除它之前,其他一些程序可能会在那里写一个新文件然后被删除。因此,您必须接受以下事实:您正在删除包含其所有内容的文件夹,或者您必须寻找其他API。
您可以使用POSIX rmdir
功能实现您的目标:
NSString *path = [url path];
int result = rmdir( [path fileSystemRepresentation] );
if (result == 0) // everything ok
else // lookup error code from errno
如果目录不为空,则会收到错误代码ENOTEMPTY
。
答案 1 :(得分:2)
这不是过度杀伤......如果你想要一个类似于- 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
答案 2 :(得分:0)
为什么不实现NSFileManager委托方法"fileManager:shouldRemoveItemAtURL:
"并在该委托方法实现中,快速检查A)该项是否为目录,B)如果目录为空则返回“{{1 }}”。