是NSURLIsExcludedFromBackupKeyrecursion

我在文档目录中有一个巨大的文件和目录树。

按照build议,我将使用NSURLIsExcludedFromBackupKey来阻止iTunes使用应用程序保存此数据。

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

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

或者我将不得不为每个文件调用它?

是的,你可以传递一个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; } 

如果有疑问,你可以testing任何文件

 id flag = nil; [URL getResourceValue: &flag forKey: NSURLIsExcludedFromBackupKey error: &error]; NSLog (@"NSURLIsExcludedFromBackupKey flag value is %@", flag) 

从我的testing(在模拟器上),它不是recursion的,我刚才有一个应用程序拒绝,因为在Documents目录中的数据太多。 直接在文档目录中的每个文件夹都被标记,所以我猜他们里面的文件不是,即使在真实的设备上。 但是我也在文件夹中添加了新的内容,所以我可能只需要再次添加标志。

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

 - (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]]; } } 

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

 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 }