Является NSURLIsExcludedFromBackupKey рекурсивным - программирование
Подтвердить что ты не робот

Является NSURLIsExcludedFromBackupKey рекурсивным

У меня есть огромное дерево файлов и dirs для кеша в моем каталоге документов.

Как и рекомендуется, я собираюсь использовать NSURLIsExcludedFromBackupKey для предотвращения сохранения iTunes этих данных с помощью приложения.

Могу ли я использовать его один раз на моем корневом каталоге, так как

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

Или мне нужно вызвать его для каждого файла?

4b9b3361

Ответ 1

Yup, вы можете передать ему 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)

Ответ 2

Из моих тестов (на симуляторе) это не рекурсивно, и у меня только что было отклонение приложения из-за слишком большого количества данных в каталоге 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]];
    }
}

Ответ 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
}