Iphone 从字典到URL写入/读取的奇怪行为

Iphone 从字典到URL写入/读取的奇怪行为,iphone,ios,ipad,nsurl,nsfilemanager,Iphone,Ios,Ipad,Nsurl,Nsfilemanager,我在网站上到处寻找类似的问题,但是我发现的其他问题的修复都没有帮助,所以我可能是看错了什么。无论如何,这是我的代码: NSFileManager *fm = [[NSFileManager alloc] init]; NSError *err = nil; NSURL *ASD = [fm URLForDirectory:NSApplicationSupportDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:YE

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

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是一个有效的字典(EDIT:做出了错误的假设,即即使文件是空的,它也会初始化字典,因此即使文件是空的,也会添加一个空的init),我得到以下日志消息:

2011-09-07 15:59:58.883 iActNow[10572:707]正在写入文件 2011-09-07 15:59:58.889 iActNow[10572:707]打开文件时出错:错误 Domain=nscocaerorrordomain Code=260“无法执行该操作。” 已完成。(Cocoa错误260。)“UserInfo=0x4ba4d0 {NSFilePath=/var/mobile/Applications/6BA775C6-29F6-4362-8860-9ADF84598531/Library/Application Support/license.plist,NSUnderlyingError=0x497080“操作 无法完成。没有这样的文件或目录“}


所以不管出于什么原因,它实际上并没有写入文件。有什么想法吗?

URLFORD目录:。。。inDomain:…
仅返回请求的标准目录应该位于的路径

它不能确保此目录实际存在


我想ASD不是这样的。您可能需要创建此目录(也可能需要创建中间目录)。

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

[dict writeToURL:path atomically:NO];  
关于这一点:

[@"Foo" writeToURL:path atomically:NO];
并且文件被正确地存储

我敢打赌,在
dict
中,您持有的自定义对象
NSDictionary
无法根据定义(即苹果规范)写入文件。您可能需要使用另一种方式将数据存储到文件中-也许可以帮助您


编辑:我刚刚注意到您将文件命名为“license.plist”-请查看的“读取和写入属性列表数据”部分,原因是NSURL无法保存到磁盘我不相信,要先保存NSURL,您需要使用以下命令将其更改为NSString:

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

[TheString absoluteURL]

这适用于NSArrays和NSDIctionary等其他对象中的NSURL

该消息的{create:YES}部分没有告诉它如果目录不存在就创建目录?喔,对不起,忘了一直水平滚动,你是对的。没问题^还有其他想法吗?