从Dictionary到URL写/读的奇怪行为

时间:2011-09-07 21:14:05

标签: iphone ios ipad nsurl nsfilemanager

我一直在网站上寻找类似的问题,但是我找到的任何其他问题的修复都没有帮助,所以也许我看错了什么。无论如何,这是我的代码:

NSFileManager *fm = [[NSFileManager alloc] init];
NSError *err = nil;
NSURL *ASD =  [fm URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YES error:&err];

if (!err) {
    NSLog(@"writing file");
    NSURL* path = [NSURL URLWithString:@"license.plist" relativeToURL:ASD];
    [dict writeToURL:path atomically:NO];
    NSString* content = [NSString stringWithContentsOfURL:path encoding:NSUTF8StringEncoding error:&err];
    if (!err) {
        NSLog(@"File:%@",content);
    }
    else
    {
        NSLog(@"Error opening file: %@",err);
    }
    return YES;
}

鉴于dict是一个有效的词典(编辑:做出了错误的假设,即使文件为空它仍会启动词典,所以即使文件为空也添加了一个空的初始) ,我得到以下日志消息:

  

2011-09-07 15:59:58.883 iActNow [10572:707]写文件   2011-09-07 15:59:58.889 iActNow [10572:707]打开文件时出错:错误   Domain = NSCocoaErrorDomain Code = 260“操作不能   完成。 (可可错误260.)“UserInfo = 0x4ba4d0   {NSFilePath =的/ var /移动/应用/ 6BA775C6-29F6-4362-8860-9ADF84598531 /库/应用程序   支持/ license.plist,NSUnderlyingError = 0x497080“操作   无法完成。没有这样的文件或目录“}

因此,无论出于什么原因,它实际上并没有写入文件。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我通过替换此调用测试了您的代码:

[dict writeToURL:path atomically:NO];  

这一个:

[@"Foo" writeToURL:path atomically:NO];

并且文件存储得当。

我敢打赌,在dict你持有NSDictionary无法根据定义写入文件的自定义对象(即Apple规范)。您可能必须使用不同的方式将数据存储到文件中 - 也许Archives and Serializations Programming Guide可以帮助您?

编辑:我刚刚注意到您将文件命名为“license.plist” - 请查看Property List Programming Guide

的“读写属性列表数据”部分

答案 1 :(得分:0)

URLForDirectory:... inDomain:...仅返回所请求的标准目录所在的路径。

它不能确保该目录确实存在。

我想ASD的情况并非如此。您可能需要创建此目录(也可能是中间目录)。

答案 2 :(得分:0)

这样做的共鸣是NSURL无法保存到磁盘我不相信,首先要保存NSURL,你需要使用以下命令将其更改为NSString:

[SomeUrl absoluteString]

然后将其保存到磁盘,当您要加载它时,必须将其加载到字符串中然后使用:

[TheString absoluteURL]

这适用于其他对象(如NSArrays和NSDictionaries)中的NSURL