【问题标题】:Odd behavior from Dictionary to URL writing/reading从字典到 URL 写入/读取的奇怪行为
【发布时间】:2011-11-12 12:36:52
【问题描述】:

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

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

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/mobile/Applications/6BA775C6-29F6-4362-8860-9ADF84598531/库/应用程序 support/license.plist, NSUnderlyingError=0x497080 "操作 无法完成。没有这样的文件或目录"}

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

【问题讨论】:

    标签: iphone ios ipad nsurl nsfilemanager


    【解决方案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 的“读取和写入属性列表数据”部分

    【讨论】:

      【解决方案2】:

      URLForDirectory:... inDomain:... 只返回请求的标准目录应该在的路径。

      它不能保证这个目录确实存在。

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

      【讨论】:

      • 如果目录不存在,该消息的 {create:YES} 部分没有告诉它创建目录?
      • 哎呀,对不起,忘了一直水平滚动,你是对的。
      • 没问题^_^还有其他想法吗?
      【解决方案3】:

      这样做的原因是我不相信 NSURL 不能保存到磁盘,要先保存 NSURL,您需要使用以下方法将其更改为 NSString:

      [SomeUrl absoluteString]
      

      然后将它保存到磁盘,当你想加载它时,你必须将它加载到一个字符串中然后使用:

      [TheString absoluteURL]
      

      这适用于其他对象中的 NSURL,例如 NSArrays 和 NSDictionaries

      【讨论】:

        猜你喜欢
        • 2012-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多