如何在复制时使用 [NSFileManager 默认管理器] 覆盖文件夹



使用下面的行,

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

我们可以复制一个文件夹,但如果该文件夹已经存在,它会抛出异常"文件存在"。为了覆盖单个文件,我们可以通过以下几行来实现它:

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

但是我想复制一个已经存在的文件夹,即覆盖

编辑 :简单的可能性,我可以在复制之前删除项目。

请提出更多可能性。

NSFileManager方法的默认行为是在文件存在时引发异常/错误"文件存在"。但是,如果您想使用NSFileManager覆盖,那么它为下面提到的 api 提供了一个 api,在第一个解决方案中也是如此:-

还有三种解决方案可以实现这一目标

第一个解决方案

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

使用上述 API,您可以覆盖文件内容。但在此之前,您必须在临时目录中备份源路径。

第二种解决方案

您已经在使用NSData writeToUrl的问题中提到.

第三种解决方案

特洛伊木马在他们的回答中提到,即删除事先被覆盖的项目。

我想再添加一个使用委托,以便使用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];

最新更新