.plist 文件写入失败!这段代码有啥问题?

Posted

技术标签:

【中文标题】.plist 文件写入失败!这段代码有啥问题?【英文标题】:.plist file writing failed! what is wrong with this code?.plist 文件写入失败!这段代码有什么问题? 【发布时间】:2012-04-27 08:54:15 【问题描述】:

在此代码之后,我的 plist 文件中没有写入任何内容。我的代码有什么问题?

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"aFile.plist"];
NSMutableDictionary *reqData = [NSMutableDictionary dictionaryWithContentsOfFile:finalPath];
/*
some modifications to "reqData"
*/
[reqData writeToFile:finalPath atomically:YES];

文件中没有写入任何内容。可能是什么问题?

【问题讨论】:

我可以从文件中读取数据。但是,我无法给它写任何东西。 【参考方案1】:

你最好写到 Document 文件夹:

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

更新

根据NSDictionary Class Reference:

此方法在写出文件之前递归地验证所有包含的对象都是属性列表对象(NSData、NSDate、NSNumber、NSString、NSArray 或 NSDictionary 的实例),如果所有对象都不是属性列表对象,则返回 NO ,因为生成的文件不是有效的属性列表。

在您的整个字典中是否有任何类型不是这些有效对象的对象?

【讨论】:

修改了我的答案...检查是否是您的情况? 不,我只有 2 种数据类型:NSNumber 和 NSDate。 @DhilipSiva 请在您使用文档目录的位置显示您修改后的代码。添加NSLog(@"filename = '%@'", finalePath);reqData writeToFile 返回一个 BOOL。价值是多少?【参考方案2】:

您正在尝试将文件写回应用程序包。

这是最有可能导致错误的原因。

如果您尝试将其写入其他地方(例如,在您的桌面文件夹中)会怎样?

【讨论】:

其实就是一个ios应用。 @DhilipSiva 好的,您是否尝试将文件写入任何其他可接受的 iPhone 位置? 这是正确的回答。您无法写入应用程序包。在 Mac 上,你可以在某些有限的情况下侥幸逃脱,但你不能有把握地假设你能做到;在 iOS 上,你不能这样做,句号。【参考方案3】:

如果您将 plist 包含在您的应用程序中,您需要在应用程序首次启动时直接将该文件复制到 Documents 中(如果尚未复制到那里)。然后,您要对 plist 执行的任何读写操作都应从 Documents 目录中的副本而不是应用程序包中的版本中完成。

【讨论】:

【参考方案4】:

要记住的第一件事:

您可以从资源中读取 plist 文件,但不能修改它。

如果你想修改,

    将该文件复制到 Documents 目录 根据类型将 plist 的内容复制到数组或字典中 根据需要进行更改 最后....保存回文档目录

这样做的技巧

【讨论】:

以上是关于.plist 文件写入失败!这段代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

写入 Azure 函数中的文件失败

写入 NSUserDefault 和 .plist 失败

关于将布尔文件写入 plist

iphone写入文件失败

Swift:从 MainBundle 读取 plist 并直接写入 Documents 失败

将 NSArray 写入 plist 文件