NSFileManager copyItemAtPath会抱怨确实存在的不存在的文件

时间:2013-03-20 06:01:59

标签: objective-c file-io nsfilemanager

我正在尝试使用[[NSFileManager defaultManager] copyItemAtPath: toPath: error:]复制文件,但它失败并出现以下错误:

  

4:文件不存在。

相关代码如下,文件确实存在且路径字符串正确,因为它是事先使用完全相同的文件路径字符串创建的。

NSFileManager* manager = [NSFileManager defaultManager];
NSError* error;
NSString* fileName = [Sound getFileName:Title];
NSString* oldDirectory = [NSString stringWithFormat:@"%@%@/", [settings stringForKey:@"downloadFolder"], authorFolder];
NSString* oldFile = [oldDirectory stringByAppendingFormat:@"%@.mp3", fileName];
NSString* newFile = [NSString stringWithFormat:@"%@/iTunes/iTunes Media/Automatically Add to iTunes/%@.mp3", [NSSearchPathForDirectoriesInDomains(NSMusicDirectory, NSUserDomainMask, YES) objectAtIndex:0], fileName];
BOOL result = [manager copyItemAtPath:oldFile toPath:newFile error:&error];
if (!result && error)
{
     NSLog(oldFile);
     NSLog(@"There was an error copying the file to the iTunes directory! %@", [error localizedDescription]);
}

这不是确切的代码,但所有相关代码都应该在上面。如果我使用[manager fileExistsAtPath:oldFile],则结果为

什么可能导致副本失败并说该文件不存在,即使它确实存在?

更新

问题已修复。原来输出文件夹真的是自动添加到iTunes.localized,但我最初只是在通过finder进行分页时没有注意到这一点。修复输出路径解决了问题!谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

如果目标路径中的任何目录不存在,那么如果源不存在,您将得到类似的错误。检查[manager fileExistsAtPath:[newFile stringByDeletingLastPathComponent] isDirectory:&isDir]返回的内容。

答案 1 :(得分:3)

您使用的API错误。您需要查看-copyItemAtPath:toPath:error:的返回值。仅当返回NO时,才表示发生了错误。

如果您正在使用ARC,那么如果没有发生错误,您的error变量 nil(虽然这在技术上无法保证),但如果您使用的话使用MRR它可能不会,因为你从未初始化它。