3

情况:我有一个 iOS 应用程序,它处理文件并让用户保存、编辑、打开这些文件并执行各种操作。我希望能够在用户打开应用程序(例如模板)以及他们自己的自定义文档时查看一些预制文档。

问题:我如何创建一个文档(或模板文件)并在用户安装我的应用程序并启动它(以及之前的所有时间)后让它出现在 Documents 文件夹中?

背景:此文档(将安装到应用程序文档目录中的文档)由我创建,而不是用户创建。

我知道要做到这一点,你需要将它保存在你的包中,然后当你的应用程序第一次运行时,默默地将它复制到文档目录中。我应该将它复制到 appDidFinishLaunchingWithOptions 方法还是我的 viewDidLoad 方法中并编写逻辑来检测它是否是应用程序第一次运行?

我的代码:在这个网页上: http: //textsnip.com/d35fbc     但是当它运行时,它总是说:“文件不存在[在文档文件夹中]”,然后它告诉我它正在被复制。问题是,当我检查应用程序的文档文件夹时,它从不存在,它仍然在包中。

为什么不使用此代码复制它是如何工作的?

4

2 回答 2

5

这些文件实际上必须添加到应用程序包中,然后在应用程序启动时静默复制。

以下代码将一个文本文件从我的包的顶层复制到文档目录(如果它尚不存在)。

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *txtPath = [documentsDirectory stringByAppendingPathComponent:@"txtFile.txt"];

if ([fileManager fileExistsAtPath:txtPath] == NO) {
    NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"txtFile" ofType:@"txt"];
    [fileManager copyItemAtPath:resourcePath toPath:txtPath error:&error];
}

这段代码中唯一的缺陷是,如果用户删除了文件,当他们再次打开应用程序时,它会立即重新出现。

于 2012-05-28T20:56:41.413 回答
3

正如您所说,您将它包含在您的应用程序包中(将其添加到您的项目中并确保它是您的目标的一部分)。然后你可以通过调用这样的东西来访问它的路径:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"MyTemplateDoc" 
                                                       ofType:@"extension"];

然后将其复制到应用程序的文档文件夹中。

NSString *docPath = <a path in your documents folder>
NSError *error = nil;
[[NSFileManager defaultManager] copyItemAtPath:bundlePath 
                                        toPath:docPath 
                                         error:&error];
if (error) {
    // handle copy error.
}
于 2012-05-24T21:53:08.320 回答