【问题标题】:Is NSURLIsExcludedFromBackupKey recursiveNSURLIsExcludedFromBackupKey 是递归的吗
【发布时间】:2013-01-17 10:23:58
【问题描述】:

我的文档目录中有一个巨大的文件和目录树用于缓存。

按照建议,我将使用NSURLIsExcludedFromBackupKey 来阻止 iTunes 通过应用程序保存这些数据。

我可以在我的根目录 URL 上使用一次吗?

[rootDirectoryURL setResourceValue:[NSNumber numberWithBool:YES] forKey:@"NSURLIsExcludedFromBackupKey" error:&error];

或者我必须为每个文件调用它吗?

【问题讨论】:

    标签: iphone ios backup


    【解决方案1】:

    是的,你可以将你想要排除的目录的 NSURL 传递给它。

    - (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
    {
        assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
    
        NSError *error = nil;
        BOOL success = [URL setResourceValue:[NSNumber numberWithBool: YES]
                                      forKey: NSURLIsExcludedFromBackupKey error: &error];
        if(!success){
            NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
        }
    
        return success;
    }
    

    如果有疑问,您可以使用

    测试任何文件
    id flag = nil;
    [URL getResourceValue: &flag
                   forKey: NSURLIsExcludedFromBackupKey error: &error];
    NSLog (@"NSURLIsExcludedFromBackupKey flag value is %@", flag)
    

    【讨论】:

    • 谢谢,NSURLIsExcludedFromBackupKey 似乎是递归的。
    • @Rog 当我获得排除目录的资源值时,它按预期返回 1,但是当我测试其中的文件时它们返回 0 - 这是预期的吗? (我没有使用 NSURLIsExcludedFromBackupKey 标记添加到我排除的目录中的文件,因为我已经排除了该目录)
    • 我不确定是否诚实,在我的情况下,只是标记该文件夹适用于其中的所有文件和其他文件夹。
    • 不确定是否还有人关注这一点 - 但是...如果我在目录上设置此标志,然后稍后将内容添加到该目录 - 我是否需要再次将其应用到目录- 或者是否涵盖了当前和未来的内容?
    • @Michael 是的,该属性显然是递归应用于现有文件的,因此如果稍后添加新文件,则不会从备份中跳过该文件。
    【解决方案2】:

    根据我的测试(在模拟器上),它不是递归的,而且由于 Documents 目录中的数据过多,我刚刚被应用拒绝。直接在 Documents 目录中的每个文件夹都被标记,所以我猜它们里面的文件没有,即使在真实设备上也是如此。但是我也在文件夹中添加了新内容,所以我可能只需要再次添加标志。

    所以我现在使用这种递归方法,并在添加的每个新文件上添加标志:

    - (void) addSkipBackupAttributeToFolder:(NSURL*)folder
    {
        [self addSkipBackupAttributeToItemAtURL:folder];
    
        NSError* error = nil;
        NSArray* folderContent = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[folder path] error:&error];
    
        for (NSString* item in folderContent)
        {
            NSString* path = [folder.path stringByAppendingPathComponent:item];
            [self addSkipBackupAttributeToFolder:[NSURL fileURLWithPath:path]];
        }
    }
    

    【讨论】:

    • 奇怪的事情,因为我去年测试过:标记一个目录实际上排除了每个文件。但是,我既没有测试过 ios ≥ 7 也没有超过 2 个子目录深度。
    • 它可能在真实设备上是递归的,因为我的应用程序由于文件夹中添加的新文件而被拒绝。
    • 在我正在处理的一个应用案例中 - 我也被拒绝了,因为我使用了 Documents 目录。然后我将所有内容都移动到缓存中(因为所有内容都可以重新下载),但仍然 - 似乎有些东西被写入了文档目录。 (通过检查手机iCloud内存备份..)我不知道它是什么(可能是一些第3方框架),但我只是添加了“功能”来删除每次应用程序启动时的文档目录......然后App终于进入了appstore .
    【解决方案3】:

    这是已接受答案的快速版本:

    func addSkipBackupAttributeToItemAtURL(URL: NSURL) -> Bool {
        assert(NSFileManager.defaultManager().fileExistsAtPath(URL.path!))
        var success: Bool = true
    
        do {
            try URL.setResourceValue(NSNumber(bool: true), forKey: NSURLIsExcludedFromBackupKey)
        } catch {
            success = false
            print("Error excluding \(URL.lastPathComponent) from backup: \(error)")
        }
    
        return success
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 2020-05-03
      • 2011-05-04
      • 1970-01-01
      相关资源
      最近更新 更多