如何为文件夹中的所有文件和文件夹设置NSURL资源值

时间:2013-03-20 13:42:37

标签: iphone ios nsurl

我正在尝试阻止整个文件夹及其内容备份到iCloud,方法是将NSURLIsExcludedFromBackupKey设置为1,如guidelines所示。我可以将密钥设置为文件夹的URL,但我保存在其中的所有数据都0NSURLIsExcludedFromBackupKey ...

这是我的代码:

//create the directory:
[[NSFileManager defaultManager] createDirectoryAtPath:path withIntermediateDirectories:NO attributes:nil error:nil];
NSURL *folderURL = [NSURL fileURLWithPath:path isDirectory:YES];

//prevent backup:
NSError *preventBackupError = nil;
BOOL success = [folderURL setResourceValue: [NSNumber numberWithBool: YES]
                                    forKey: NSURLIsExcludedFromBackupKey
                                     error: &preventBackupError];        

//this prints 1 and 1:
NSLog(@"resource values for directory: %@", [folderURL resourceValuesForKeys:@[NSURLIsExcludedFromBackupKey, NSURLIsDirectoryKey] error:nil]);

现在,如果我将文件(在本例中为config.xml)保存在folderURL的子目录中,然后执行:

NSURL *fileURL = [NSURL fileURLWithPath:[path stringByAppendingPathComponent:@"config.xml"]];
if ([[NSFileManager defaultManager] fileExistsAtPath:fileURL.path]) {
    NSLog(@"resource values for config file: %@", [configURL resourceValuesForKeys:@[NSURLIsExcludedFromBackupKey] error:nil]);
} 

这会打印NSURLIsExcludedFromBackupKey = 0;

我查看了其他SO答案,例如this onethis onethis one,我看不出语法上的任何差异......

所以我的问题是,我是否必须手动将该密钥设置到文件夹中的每个文件?或者我做错了什么?

干杯

1 个答案:

答案 0 :(得分:1)

Cocoa没有内置的单一方法来递归地将属性应用于资源及其后代。我想是一些原因是为了简化错误处理。但是,这样做非常罕见。

幸运的是,建立自己的很容易:

  1. 将所需的属性应用于有问题的目录资源
  2. NSFileManager询问目录枚举器
  3. 枚举所有项目(默认情况下,NSDirectoryEnumerator将下载到所有子目录中),同时将属性应用于每个子目录
  4. 看起来似乎不需要你的情况;将NSURLIsExcludedFromBackupKey应用于目录,然后完成。