NSFileManager removeItemAtPath очищает содержимое каталога, но не сам каталог. - PullRequest
1 голос
/ 15 ноября 2011

У меня есть код, который копирует все каталоги из "/ Documents" в "Library / Caches /".Код выглядит следующим образом:

NSString *oldPath = [NSString stringWithFormat:@"%@/Documents/", NSHomeDirectory()];
NSString *newPath = [NSMutableString stringWithFormat:@"%@/Library/Caches/", NSHomeDirectory()];
NSError *error = nil;

// get the list of all files and directories

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *fileList = [fileManager contentsOfDirectoryAtPath:oldPath error:&error];

if(error != nil)
{
    NSLog(@"\n\n\n1. There was an error in the file operation: %@", [error localizedDescription]);
    return;
}

for(NSString *file in fileList) 
{
    NSString *path = [oldPath stringByAppendingPathComponent:file];

    NSLog(@"The path for the file is: %@", path);

    BOOL isDir = NO;

    BOOL dirExists = [fileManager fileExistsAtPath:path isDirectory:(&isDir)];

    if(isDir && dirExists) 
    {
        //Move to the new location
        [fileManager copyItemAtPath:path toPath:[newPath stringByAppendingPathComponent:file] error:&error];
        if(error != nil)
        {
            NSLog(@"\n\n\n2. There was an error in the file operation: %@", [error localizedDescription]);
        }
        else
        {
            [fileManager removeItemAtPath:path error:&error];

            if(error != nil)
                NSLog(@"\n\n\n3. There was an error in the file operation: %@", [error localizedDescription]);
        }
    }
}

Копия работает отлично.Я вижу все каталоги, скопированные в новое местоположение.

Проблема в том, что пустые каталоги все еще остаются в папке «Документы».Я прочитал removeItemAtPath в документации и там написано, что содержимое каталога удалено.Удаляется ли сама директория или нет, не упоминается.

Может кто-нибудь сказать мне, что может быть не так в коде?Почему все еще остаются пустые каталоги?

РЕДАКТИРОВАТЬ:

При первом проходе, когда каталоги существуют в Документах, но не в Библиотеке / Кэшах, removeItemAtPath не вызывает ошибку.Пустые каталоги все еще остаются в Документах, хотя.На втором проходе приведенного выше кода он пытается удалить пустые каталоги и removeItemAtPath выдает ошибку какао 516, которая в основном не найдена в файле - это странно, потому что я все еще вижу эти пустые каталоги.

Кроме того, я запускаю этот код на iPhone Simulator 4.3.2 и iPhone Simulator 5.0 и наблюдаю за структурой каталогов на моем Mac в / Users / Библиотека / Поддержка приложений / iPhone Simulator /....

1 Ответ

3 голосов
/ 15 ноября 2011

Это может происходить из-за "/" в конце "/ Documents /". Попробуйте удалить завершающий символ "/" из первых двух строк или используйте это:

NSString *oldPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
NSString *newPath = [NSString pathWithComponents:[NSArray arrayWithObjects:NSHomeDirectory() , @"Library", @"Caches", nil]];

NSError *error = nil;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *fileList = [fileManager contentsOfDirectoryAtPath:oldPath error:&error];

if (error) {
    NSLog(@"\n\n\n1. There was an error in the file operation: %@", [error localizedDescription]);
    return;
}

for (NSString *file in fileList)  {
    NSString *path = [oldPath stringByAppendingPathComponent:file];
    NSLog(@"The path for the file is: %@", path);

    BOOL isDir = NO;

    if ([fileManager fileExistsAtPath:path isDirectory:&isDir] && isDir) {
        [fileManager copyItemAtPath:path toPath:[newPath stringByAppendingPathComponent:file] error:&error];
        if(error) {
            NSLog(@"\n\n\n2. There was an error in the file operation: %@", [error localizedDescription]);
        } else {
            [fileManager removeItemAtPath:path error:&error];

            if (error) {
                NSLog(@"\n\n\n3. There was an error in the file operation: %@", [error localizedDescription]);
            }
        }
    }
}
...