iOS - 在我的应用程序中打开后复制文件

时间:2013-08-18 18:51:14

标签: ios cocoa-touch

单击使用以下代码打开(pdf文件)后

-(BOOL)application:(UIApplication *)application
       openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
    annotation:(id)annotation {
if (url != nil && [url isFileURL]) {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSFileManager *filemgr;
    NSError *erf;
    filemgr = [NSFileManager defaultManager];
    if ([filemgr copyItemAtPath:[NSString stringWithFormat:@"%@", url] toPath:documentsDirectory error: &erf]  == YES)
        NSLog (@"Copy successful");
    else
        NSLog (@"Copy failed%@dest: %@", erf, url);
}
return YES;

}

我想复制文件到我的应用程序,但我有这个错误:

  

错误Domain = NSCocoaErrorDomain Code = 260“操作无法完成。(Cocoa错误260.)”UserInfo = 0x200826c0 {NSFilePath = file:// localhost / private / var / mobile / Applications / < em> * .pdf,NSUnderlyingError = 0x20082510“操作无法完成。没有这样的文件或目录”}   WHI?

2 个答案:

答案 0 :(得分:1)

您无法使用NSURL将代表文件网址的NSString转换为stringWithFormat:。您需要在path上调用NSURL方法。 toPath:参数必须是包含文件名的完整路径,而不仅仅是您要复制到的目录。

NSString *sourcePath = [url path];
NSString *destPath = [documentsDirectory stringByAppendingPathComponent:[url lastPathComponent]];

if ([filemgr copyItemAtPath:sourcePath toPath:destPath error:&erf]) {

答案 1 :(得分:0)

您可能想要考虑将其移动到后台队列/线程,因为您实际上是在调用应用程序时将其锁定。这有两个主要的副作用

  1. 您的应用在复制操作期间似乎已挂起,这对用户体验不会有好处。
  2. 如果复制需要太长时间,应用程序将无法响应操作系统,因此操作系统会认为应用程序已永久挂起并将其终止。
  3. 我会编写一个新的方法来获取一个URL进行复制,然后你可以对该方法进行一些单元测试,以确保它是可靠的,然后再将它安排到应用程序中的队列/后台线程:openURL:sourceApplication:注释: