情况: 我有一个处理文件的iOS应用程序,让用户可以使用这些文件保存,编辑,打开和执行各种操作。我希望能够为用户提供一些预先制作的文档,以便他们在打开应用程序(例如模板)时查看他们自己的自定义文档。
问题: 如何创建文档(或模板文件)并在用户安装我的应用程序并启动它之后(以及之前的所有时间)将其显示在Documents文件夹中?
背景: 此文档(将安装到应用程序文档目录中的文档)由我创建,而不是由用户创建。
我知道要执行此操作,您需要将其保存在捆绑包中,然后当您的应用首次运行时,将其静默复制到文档目录中。我应该在appDidFinishLaunchingWithOptions方法或我的viewDidLoad方法中复制它,并编写逻辑来检测它是否是第一次运行应用程序?
我的代码: 在此网页上:http://textsnip.com/d35fbc 但是当它运行时,它总是说:“文件不存在[在文档文件夹中]”,然后它告诉我它正在被复制。问题是,当我检查应用程序的文档文件夹时,它永远不存在,它仍然在捆绑中。
为什么不用这段代码复制 这是如何工作的?
答案 0 :(得分: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];
}
此代码中唯一的缺陷是,如果用户删除该文件,它会在再次打开应用程序时立即重新出现。
答案 1 :(得分: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.
}