0

我最近开始玩 iPhone 文件系统,起初我在理解一些概念时遇到了一些困难,但我认为最终我把它们弄明白了。

我的问题是我试图通过将application:openURL:sourceApplication:annotation:方法实现到文档目录(NSDocumentDirectory这。

BOOL我用我的文件管理器在复制文件时返回的值创建了一个([fileManager copyItenAtPath:filePath toPath:newFilePath error:&error];其中 newFilePath 是我的文档目录),然后检查它,然后 NSLog 如果有失败或成功,我总是会失败。

为了找出我的 Documents 目录发生了什么,我启用了文件共享,而不是看到我复制的文件,我得到了一个收件箱文件夹,在将该文件夹复制到桌面后,我看到我的文件在那里. 为什么会出现这种行为?我怎样才能得到我想要的结果?

我在 Apple 文档中的某处读到,当UIDocumentInteractionController打开一个文件时,它会将其复制到收件箱文件夹中,但显然,我的应用程序没有使用UIDocumentInteractionController.

提前感谢您,非常感谢您的帮助。


编辑从这里开始

这是我的原始代码:

//AppDelegate.m
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication (NSString *)sourceApplication annotation:(id)annotation
{
    rootFolder.fileURLFromLaunch = url; //Passing the URL on to aproperty on a different class
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ApplicationDidOpenFile" object:nil]; // notifying that the URL was passed and a file was opened
    return YES;
}

这是对文件进行所有工作的类:

//RootFolder.m

- (void)copyFileIntoApp
{

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsPath = [paths objectAtIndex:0];

    NSString *filePath = [fileURLFromLaunch path];

    NSString *displayName = [filePath lastPathComponent];

    NSError *error = NULL;

    NSString *finalFilePath = [NSString stringWithFormat:@"%@/%@", documentsPath, displayName];

if ([fileManager fileExistsAtPath:finalFilePath]) {

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"File already exists!" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];

} else {

    BOOL success = [fileManager copyItemAtPath:filePath toPath:finalFilePath error:&error];
    if (success) {

        NSLog(@"success");
        Document *document = (Document *) [NSEntityDescription insertNewObjectForEntityForName:@"Document" inManagedObjectContext:managedObjectContext];

        [document setFilename:displayName];

        [document setPath:finalFilePath];

        if (![managedObjectContext save:&error]) {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Please try again or restart the app" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
            [alert release];
        }

        [fileArray insertObject:document atIndex:0];

        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];

        [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                              withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

    } else {
        NSLog(@"failure %@ ", [error localizedDescription]);
    }


}

}

我希望这能更清楚地说明问题。

4

2 回答 2

1

您是否在实例化时将错误设置为空?如果您不NSError指向的内存不会为 NULL,那么您的逻辑就会被触发。

做这个:

NSError *error = NULL;

不是这个:

NSError *error;
于 2011-03-06T15:54:14.317 回答
1

我得到一个收件箱文件夹,将该文件夹复制到桌面后,我看到我的文件在那里。为什么会出现这种行为?我怎样才能得到我想要的结果?

因为您的应用程序是沙盒化的,并且无法访问不在其自己目录中的文件。当用户告诉 iOS 他想用特定应用打开文件时,iOS 会将文件复制到收件箱目录中。


贴出完整的代码application:openURL:sourceApplication:annotation:
您的“我正在做这个和那个”并不是很有帮助,因为在这个和那个之间存在缺陷。您用您的话解释的算法是正确的,但是您的实现中显然存在错误。

因此,请发布此方法的完整代码。


编辑:我测试了您代码的相关部分,它们似乎有效。

我会检查这fileManager不是零。这可以解释为什么您没有看到错误消息。

于 2011-03-06T16:38:26.343 回答