检查目录是否为空,或仅在Objective-C中为空时删除

时间:2012-07-04 06:17:16

标签: objective-c nsurl nsfilemanager

NSFileManager removeItemAtURL仅执行递归删除。非空目录没有特殊处理。

如何通过事先测试条件来删除空目录?有contentsOfDirectoryAtPath来获取文件列表,这些文件可能是空的,但这太过分了。

或者,是否有一个函数只有在空的情况下将其删除,就像好的rmdir一样?啊,我可以称之为......

3 个答案:

答案 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 }}”。