如何在复制时使用覆盖文件夹?
使用下面的行,
[fileManager copyItemAtPath:sourcePath toPath:targetPath error:&error];
我们可以复制一个文件夹,但如果该文件夹已经存在,则会抛出一个“File Exists”exception。 为了覆盖单个文件,我们可以通过以下几行来实现:
NSData *myData = [NSData dataWithContentsOfURL:FileURL]; /fetch single file [myData writeToFile:targetPath atomically:YES];
但我想复制一个已经存在的文件夹,即覆盖 。
编辑 :简单的可能性,我可以在复制它们之前删除项目。
请提出更多的可能性。
NSFileManager
方法的默认行为是抛出exception/错误“File Exists”。 当文件存在时。 但是,如果你想使用NSFileManager
覆盖,那么它提供了一个API,下面提到replaceItemAtURL以及第一个解决scheme:
还有三个解决scheme来实现这一点
第一个scheme
[filemanger replaceItemAtURL:url1 withItemAtURL:url2 backupItemName:@"/Users/XYZ/Desktop/test.xml" options:NSFileManagerItemReplacementUsingNewMetadataOnly resultingItemURL:nil error:nil];
使用上面的API可以覆盖文件内容。 但在此之前,您必须在临时目录中备份源path。
第二个scheme
你已经提到你的问题使用NSData writeToUrl
。
第三个scheme
trojanfoe在他们的回答中提到。 即事先删除被覆盖的项目。
我想添加一个使用委托,以覆盖copyItemAtPath(NSFileManager)函数使用的文件:
[[NSFileManager defaultManager] setDelegate:self]; [[NSFileManager defaultManager] copyItemAtPath:fileOrigin toPath:fileDestin error:&error];
并实现委托可选function:
- (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];