Как переписать папку с помощью [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];