Удалить каталог, если он пуст

Я пытаюсь проверить, если папка пуста, и если это так, удалите ее, используя следующий код:

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

Это не сработало, и я предполагаю, что пропустил что-то глупое, но был бы признателен за любые указатели.

  • Обновление: проблема была в моей собственной глупости - уходить ! на второй линии. Удалите это, и это работает как ожидалось.

4 ответа

Решение

Вы хотите это:

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
}

Иногда методы 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() удаляет каталог, только если он пуст, поэтому нет необходимости перечислять каталог раньше.

Я предполагаю, что либо "theDirectory" равен nil, либо указывает на каталог, который не существует, потому что только в этих случаях "! FolderContents" будет иметь значение true. Если "theDirectory" будет указывать на существующую папку, вы получите пустой массив и не попадете в блок "if".

Попробуй это:

NSArray *folderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:theDirectory error:&error];
//if (!folderContents)
if (folderContents.count == 0)
{
    NSLog(@"empty");
    [[NSFileManager defaultManager] removeItemAtPath:theDirectory error:&error];
}  
Другие вопросы по тегам