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

问题描述 投票:0回答:4

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

如何通过预先测试条件来仅删除空目录?有

contentsOfDirectoryAtPath
可以获取文件列表,该列表可能是空的,但这太过分了。

或者,是否有一个函数可以仅在为空时将其删除,例如good ol'

rmdir
?啊,我可以这么称呼……

objective-c nsurl nsfilemanager
4个回答
7
投票

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

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

您可以使用 POSIX

rmdir
函数来实现您的目标,如下所示:

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

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

ENOTEMPTY


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

0
投票

为什么不实现 NSFileManager 委托方法

fileManager:shouldRemoveItemAtURL:
并在该委托方法实现中,快速检查一下 A)该项目是否是一个目录,B)在返回“
YES
”之前该目录是否为空”.


0
投票

本世纪的答案! :)

if let k = try? FileManager.default
    .contentsOfDirectory(at: dd, includingPropertiesForKeys: nil),
   k.isEmpty {
    .. the directory is empty
}
© www.soinside.com 2019 - 2024. All rights reserved.