iPhone:copyItemAtPath 中的错误

Posted

技术标签:

【中文标题】iPhone:copyItemAtPath 中的错误【英文标题】:iPhone: Error in copyItemAtPath 【发布时间】:2013-11-25 04:50:32 【问题描述】:

我正在尝试将文件从一个文件夹复制到文档目录中的另一个文件夹,如下所示:

    - (void)saveFile:(NSString *)folderPath

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"destination.png"];

    NSError *error = nil;
    NSString *srcPath = [folderPath stringByAppendingPathComponent:@"filename.png"];


    BOOL success = [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:documentsDirectory error:&error];
    if (error)
    
        NSLog(@"%@",error);
    

    if (success == YES)
    
        NSLog(@"Copied");
    
    else
    
        NSLog(@"Not Copied");
    

当我记录错误时,它会给我以下消息:

Error Domain=NSCocoaErrorDomain Code=516 "The operation couldn’t be completed. (Cocoa error 516.)" UserInfo=0x9d665a0 NSUserStringVariant=(
    Move
), NSFilePath=/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BC37C9D7-7995-47C1-8131-2B07BADCBECB/Documents/foldername/B713320C-2CA0-4FD3-93F6-71D76B102B83/src.png, NSDestinationFilePath=/Users/username/Library/Application Support/iPhone Simulator/5.1/Applications/BC37C9D7-7995-47C1-8131-2B07BADCBECB/Documents, NSUnderlyingError=0x9d41c60 "The operation couldn’t be completed. File exists"

【问题讨论】:

仔细阅读错误,您的答案在该名称的错误文件中已经存在 【参考方案1】:

问题 1: 出现此问题的原因是,该目录已包含具有相同文件名的文件。

您应该检查文件夹中是否存在该文件:

- (void)saveFile:(NSString *)folderPath

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"destination.png"];

    NSError *error = nil;
    NSString *srcPath = [folderPath stringByAppendingPathComponent:@"filename.png"];

    if ([[NSFileManager defaultManager] fileExistsAtPath:dataPath])
    
        //removing file
        if (![[NSFileManager defaultManager] removeItemAtPath:dataPath error:&error])
        
            NSLog(@"Could not remove old files. Error:%@",error);
        
    
    BOOL success = [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:dataPath error:&error];
    if (success == YES)
    
        NSLog(@"Copied");
    
    else
    
        NSLog(@"Not Copied %@", error);
    

问题 2: 您必须提供文件名而不是目录。

替换:

BOOL success = [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:documentsDirectory error:&error];

与:

BOOL success = [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:dataPath error:&error];

【讨论】:

【参考方案2】:

copyItemAtPath: 给出错误,因为该文件已存在于该位置。因此,您应该在复制文件之前执行此操作。

if ([[NSFileManager defaultManager] fileExistsAtPath: srcPath])
        [[NSFileManager defaultManager] removeItemAtPath: srcPath error:nil];

【讨论】:

【参考方案3】:

替换这一行:

BOOL success = [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:documentsDirectory error:&error];

与:

BOOL success = [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:dataPath error:&error];

【讨论】:

以上是关于iPhone:copyItemAtPath 中的错误的主要内容,如果未能解决你的问题,请参考以下文章

NSFileManager copyItemAtPath toPath

即使目录存在,iOS copyItemAtPath 大多数时候也会失败

在python中的错误点使用哔声

NSFilemanager 委托方法中的 syslog

R 中的错​​误:当我尝试应用外部函数时:

[译]Javascript中的错误信息处理(Error handling)