如何在复制时使用[NSFileManager defaultManager]覆盖文件夹?

 大鱼 发布于 2023-02-09 11:10

使用下面的行,

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

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

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

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

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

请提出更多可能性.

2 个回答
  • NSFileManager方法的默认行为是抛出异常/错误"文件存在".当文件存在时.但是如果你想覆盖使用NSFileManager那么它为第一个解决方案提供了一个api,以及下面提到的replaceItemAtURL: -

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

    第一解决方案

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

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

    二解决方案

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

    第三解决方案

    特洛伊福福在答案中提到过.即删除事先被覆盖的项目.

    2023-02-09 11:11 回答
  • 我想用delegate添加一个,以便用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;
    }
    

    2023-02-09 11:12 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有