我的文档目录中有一个巨大的文件和目录用于缓存。
根据建议,我将使用NSURLIsExcludedFromBackupKey
阻止iTunes使用该应用保存此数据。
我可以在根目录网址上使用一次,如
[rootDirectoryURL setResourceValue:[NSNumber numberWithBool:YES] forKey:@"NSURLIsExcludedFromBackupKey" error:&error];
或者我必须为每个文件调用它吗?
答案 0 :(得分:26)
是的,您可以将其传递给您要排除的目录的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)
答案 1 :(得分:1)
从我的测试(在模拟器上),它不是递归的,我刚刚因为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]];
}
}
答案 2 :(得分:0)
以下是接受答案的快速版本:
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
}