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

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

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

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

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

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

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

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

4 ответов


по умолчанию 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 упомянул в их ответ. т. е. удалите элемент, который перезаписывается заранее.


Я хотел бы добавить еще один делегат, чтобы переопределить файлы с помощью функции 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;
}

Сначала удалите элемент с помощью:

[fileManager removeItemAtPath:targetPath error:NULL];

(т. е. игнорирование любой ошибки)


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