iPhone - 将文件从资源复制到Documents会产生错误

时间:2009-07-15 15:08:12

标签: iphone

我正在尝试将我的Resources文件夹中的mp3文件复制到应用程序“Documents”文件夹中的文件夹。在模拟器上这很好用。但是当我在设备上运行它时,复制文件会给我带来这个错误

Operation could not be completed. (Cocoa error 513.)

源路径和目标路径很好,但我仍然无法复制文件。有任何想法吗?我在哪里可以找到可可错误代码513的含义?

感谢。

这是相关的源代码

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"Files"];

    NSString *insPath = [NSString stringWithFormat:@"%@.mp3", fileName];
    NSString *srcPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:insPath];
    NSString *destPath = [folderPath stringByAppendingPathComponent:insPath];
    NSLog(@"Src: %@, Dest: %@", srcPath, destPath);

    NSError *err;
    [fileManager moveItemAtPath:srcPath toPath:destPath error:&err];

    NSLog(@"Err desc-%@", [err localizedDescription]);
    NSLog(@"Err reason-%@", [err localizedFailureReason]);

在调用moveItemAtPath之前,我还创建了目录“Files”,它返回YES。

这是日志结果

Src: /var/mobile/Applications/512D7565-7EF7-4C13-A015-19EEC3F3B465/MyApp.app/MyFile.mp3, Dest: /var/mobile/Applications/512D7565-7EF7-4C13-A015-19EEC3F3B465/Documents/Files/MyFile.mp3

Err desc-Operation could not be completed. (Cocoa error 513.)
Err reason-(null)

一个问题

将资源从资源复制到Documents文件夹时,文件大小是否有限制?我试图复制的文件大约是5MB。这可能是个原因吗?

3 个答案:

答案 0 :(得分:19)

编辑:

想出一个更简单的解决方案。代替 moveItemAtPath:toPath:error:,只需使用copyItemAtPath:toPath:error:...因为我们真的想从mainBundle复制文件而不是移动它。我应该早点想到这个!

E.g。

[[NSFileManager defaultManager] copyItemAtPath:mainBundleFilePath 
                                        toPath:destPath 
                                         error:&err]

请参阅我之前的评论,了解其原因。


我相信我有这个问题的答案。我可以肯定地说问题不是目标文件路径。

我得到了相同的Cocoa错误513(NSFileWriteNoPermissionError),几乎完全相同的代码:

[[NSFileManager defaultManager] moveItemAtPath:mainBundleFilePath 
                                        toPath:destPath 
                                         error:&err]

问题似乎是来自mainBundle的文件没有适当的权限移动到另一个地方。我不确定这个命令(如果执行的话)是否实际上从mainBundle移动文件或只是复制它......但不管怎样,文件管理器都没有'似乎喜欢这个主意。

解决方案很简单:只需将mainBundle文件读入NSData对象,然后将NSData写入新文件即可。请注意,两个示例中的目标文件路径都相同,这表明lostInTransit说他的文件路径正常是正确的。

对于此示例,以下代码将起作用而不会抛出错误:

NSData *mainBundleFile = [NSData dataWithContentsOfFile:mainBundleFilePath];
[[NSFileManager defaultManager] createFileAtPath:destPath 
                                        contents:mainBundleFile 
                                      attributes:nil];
BTW,在我自己的代码中,我没有为属性传递nil,而是设置了一个带有NSFileModificationDate属性的NSDictionary。我还在处理if语句的错误中包装了createFileAtPath:contents:属性。换句话说,

if (![[NSFileManager defaultManager] createFileAtPath:destPath 
                                             contents:mainBundleFile 
                                           attributes:myAttributes]) { 
 // handle error as necessary, etc...

}

我花了一段时间来计算所有这些,所以希望这个解决方案对其他人有所帮助。

答案 1 :(得分:3)

您确定要正确获取Documents文件夹的路径吗?模拟器中的绝对路径与设备上的绝对路径不同。

您应该使用以下内容确保获得Documents目录的正确路径:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

设备上的documentsDirectory路径类似于:

的/ var /移动/应用/ 30B51836-D2DD-43AA-BCB4-9D4DADFED6A2 /文件

模拟器上的路径类似于:

/ Volumes / Stuff / Users / johnDoe / Library / Application Support / iPhone Simulator / User / Applications / 118086A0-FAAF-4CD4-9A0F-CD5E8D287270 / Documents

您可以在文件和文件中阅读更多内容。 dev site上的网络页面。

答案 2 :(得分:2)

那是NSFileWriteNoPermissionError

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html

不知何故,你确实有错误的路径而且不会让你写在那里。您也可以删除该应用并重试,以防您的应用文档目录设置为错误的权限......

我会给我们执行复制的代码行,并打印出该行中使用的每个变量。然后我们就可以看出问题所在。