3

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

如何通过事先测试条件仅删除空目录?有contentsOfDirectoryAtPath一个文件列表,它可能是空的,但这是矫枉过正的。

或者,是否有一个功能可以仅在为空时将其删除,例如 good ol' rmdir?啊,我可以这样称呼……</p>

4

3 回答 3

7

如果你想留在基金会的土地上,你必须使用它,没有其他办法。

但是如果你这样做,你就会引入一个竞争条件:在你列出目录的内容之后,在你删除它之前,一些其他程序可能会在那里写入一个新文件,然后将其删除。因此,您必须接受您正在删除包含所有内容的文件夹这一事实,或者您必须寻找不同的 API。

您可以使用 POSIXrmdir函数来实现您的目标,如下所示:

NSString *path = [url path];
int result = rmdir( [path fileSystemRepresentation] );
if (result == 0) // everything ok
else // lookup error code from errno

如果目录不为空,您将收到错误代码ENOTEMPTY

于 2012-07-04T06:26:32.777 回答
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
于 2012-07-04T06:29:07.147 回答
0

为什么不实现 NSFileManager 委托方法fileManager:shouldRemoveItemAtURL:,在该委托方法实现中,快速检查 A)项目是否为目录,B)在返回“ YES”之前该目录是否为空。

于 2012-07-04T06:26:05.230 回答