如何在复制时使用覆盖文件夹?

使用下面的行,

[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];