Как перезаписать папку с помощью [NSfilemanager defaultmanager] при копировании?

Используя приведенную ниже строку,

[fileManager copyItemAtPath:sourcePath toPath:targetPath error:&error];

Мы можем скопировать папку, но если папка уже существует, она выдает исключение "Файл существует". Чтобы перезаписать один файл, мы можем достичь его в следующих строках:

NSData *myData = [NSData dataWithContentsOfURL:FileURL]; /fetch single file
[myData writeToFile:targetPath atomically:YES];

Но я хочу скопировать уже существующую папку i.e, переписать.

Изменить: Простая возможность, я могу удалить элементы перед их копированием.

Пожалуйста, предложите больше возможностей.

Ответ 1

Поведение метода NSFileManager по умолчанию - это исключение/ошибка "Файл существует". когда файл существует. Но если вы хотите перезаписать с помощью NSFileManager, то он предоставляет один api для того, что упоминается ниже replaceItemAtURL, а также в первом решении: -

Также есть три решения для достижения этого

Первое решение

[filemanger replaceItemAtURL:url1 
               withItemAtURL:url2
              backupItemName:@"/Users/XYZ/Desktop/test.xml"
                     options:NSFileManagerItemReplacementUsingNewMetadataOnly 
            resultingItemURL:nil error:nil];

Используя вышеуказанный API, вы можете перезаписать содержимое файла. Но перед этим вам нужно взять резервную копию исходного пути в своем временном каталоге.

Второе решение

Вы уже упомянули в своем вопросе, используя NSData writeToUrl.

Третье решение

trojanfoe упомянула в свой ответ. i.e удалите перезаписанный элемент заранее.

Ответ 2

Я хотел бы добавить еще один делегат, чтобы переопределить файлы с помощью функции copyItemAtPath (NSFileManager):

[[NSFileManager defaultManager] setDelegate:self];
[[NSFileManager defaultManager] copyItemAtPath:fileOrigin toPath:fileDestin error:&error];

и реализовать дополнительную функцию делегатов:

 - (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error copyingItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{
    if ([error code] == NSFileWriteFileExistsError) //error code for: The operation couldn’t be completed. File exists
        return YES;
    else
        return NO;
}

Ответ 3

Сначала удалите элемент, используя:

[fileManager removeItemAtPath:targetPath error:NULL];

(т.е. игнорируя любую ошибку)

Ответ 4

    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
        [[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];