【问题标题】:Remove directory if empty如果为空则删除目录
【发布时间】:2013-04-03 19:02:53
【问题描述】:

我正在尝试使用以下代码检查文件夹是否为空,如果是则将其删除:

NSArray *folderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:theDirectory error:&error];
if (!folderContents){
    if (folderContents.count == 0)
    {
        NSLog(@"empty");
        [[NSFileManager defaultManager] removeItemAtPath:theDirectory error:&error];
    }  
}

这没有奏效,我猜我错过了一些愚蠢的东西,但希望得到任何指点。

  • 更新: 问题是我自己的愚蠢——第二行的流浪!。 删除它,它会按预期工作。

【问题讨论】:

  • 为什么你先否定if?
  • 因为我是个白痴 - 在正确检查之前留下了一个流浪者 ! 并在此处发布了代码。谢谢。
  • 这不是白痴。它发生了,愚蠢的一个。顺便说一句,您获得了 5 分,并帮助其他人也获得了 :)

标签: ios objective-c nsfilemanager


【解决方案1】:

你想要这个:

NSError *error = nil;
NSArray *folderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:theDirectory error:&error];
if (folderContents) {
    if (folderContents.count == 0) {
        NSLog(@"empty");
        [[NSFileManager defaultManager] removeItemAtPath:theDirectory error:&error];
    }
} else {
    // log error
}

【讨论】:

  • 谢谢 - 没有意识到我把 ! 留在了。我是罪魁祸首。
【解决方案2】:

有时 POSIX 方法更有效:

#include <unistd.h> 

if (rmdir([theDirectory fileSystemRepresentation]) == 0) {
    // directory successfully removed (must have been empty!)
} else if (errno == ENOTEMPTY) {
    // directory not empty
} else {
    // other error
}

rmdir() 仅在目录为空时删除目录,因此之前不需要枚举目录。

【讨论】:

  • 谢谢 - 我什至不知道这些方法。
  • @Robert:iOS 基于 Unix 有时很有用 :-)
【解决方案3】:

我猜“theDirectory”要么为 nil,要么指向一个不存在的目录,因为只有在这些情况下,“!folderContents”才会评估为真。如果“theDirectory”指向一个现有文件夹,你会得到一个空数组并且不会进入“if”块。

【讨论】:

  • 原代码的问题是在第一条if语句中误用了!操作符。
  • 原代码和现在的代码在功能上是一样的。是的,我同意,应该完全删除“if(!folderContents) {}”。
  • 其实没有。不应删除第一个 if。只应删除!。否则第二个if 将评估为真,即使有错误并且folderContentsnil
  • 但最初的问题仍然是“theDirectory”不包含有效目录,对吧?否则你的代码不会打印“空”。
  • 是的,我不确定那里发生了什么并且无法重现它,所以我从 OP 中删除了该部分。
【解决方案4】:

试试这个:

NSArray *folderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:theDirectory error:&error];
//if (!folderContents)
if (folderContents.count == 0)
{
    NSLog(@"empty");
    [[NSFileManager defaultManager] removeItemAtPath:theDirectory error:&error];
}  

【讨论】:

  • 这不能正确处理错误。如果对contentsOfDirectoryAtPath 的调用出错,则返回值为nil。在nil 上调用folderContents.count 会得到0,因此即使出现错误,您也会尝试删除该文件夹。
  • @duDE:赞成,因为您的回答足以让我解决我的问题。接受 rmaddy 的,因为它更完整。谢谢。
猜你喜欢
  • 2012-11-14
  • 2016-01-23
  • 1970-01-01
  • 2019-06-18
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 2020-07-12
相关资源
最近更新 更多