将“不备份”属性添加到iOS 5.0.1中的文件夹层次结构中

时间:2012-01-01 16:23:27

标签: iphone ios

引用iCloud + Storage of media in iPhone Documents folder,其中显示了如何为文件设置iOS 5.0.1“不备份”属性。

是否有一种有效的方法可以对整个文件夹/文件层次结构执行此操作?例如,我的应用程序创建/ Library / PrivateDocs,并使用多个文件夹,子文件夹和文件填充它。我可以在顶级文件夹中设置do-not-backup属性,还是必须在其下的每个文件和文件夹上设置?

而且,如果必须在每个文件/子文件夹上设置,那么这样做的有效方法是什么?

6 个答案:

答案 0 :(得分:25)

为了这个目的,您可以在文档目录中放置一个特定目录,将所有内容放入其中,并仅使用

将该单个目录标记为do-not-backup
 addSkipBackupAttributeToItemAtURL

您链接的文章中显示的方法,或使用此方法使用路径而不是网址:

+ (void)addSkipBackupAttributeToPath:(NSString*)path {
    u_int8_t b = 1;
    setxattr([path fileSystemRepresentation], "com.apple.MobileBackup", &b, 1, 0, 0);
}

使用目录的示例:

NSString *docsDirPath = [(AppDelegate*)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory];
NSString *yourContentsDirPath = [docsDirPath stringByAppendingPathComponent:gContentsDirName];

[Utilities addSkipBackupAttributeToPath:yourContentsDirPath];

[编辑]

我忘记了在委托中使用此方法来获取文档目录:

- (NSString *)applicationDocumentsDirectory {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

答案 1 :(得分:7)

对于我在这里的所有朋友,他们需要Swift - 只需看下面(iOS8.0)

func addSkipBackupAttributeToItemAtURL(URL:NSURL) ->Bool{

let fileManager = NSFileManager.defaultManager()
assert(fileManager.fileExistsAtPath(URL.absoluteString))

var error:NSError?
let success:Bool = URL.setResourceValue(NSNumber.numberWithBool(true),forKey: NSURLIsExcludedFromBackupKey, error: &error)

if !success{

    println("Error excluding \(URL.lastPathComponent) from backup \(error)")
}

return success;

}

答案 2 :(得分:2)

对我来说,在Swift中,之前回答的功能并不常用。特别是断言线失败了。我需要从URL.absoluteString更新它!到URL.path!所以最后我看起来像这样:

func addSkipBackupAttributeToItemAtURL(URL:NSURL) ->Bool{

    let fileManager = NSFileManager.defaultManager()
    assert(fileManager.fileExistsAtPath(URL.path!))

    var error:NSError?
    let success:Bool = URL.setResourceValue(NSNumber(bool: true),forKey: NSURLIsExcludedFromBackupKey, error: &error)

    if !success{
        println("Error excluding \(URL.lastPathComponent) from backup \(error)")
    }

    return success;
}

答案 3 :(得分:1)

也许这可以帮助使用swift 2的人:

@UIApplicationMain之前添加:

extension NSFileManager{
    func addSkipBackupAttributeToItemAtURL(url:NSURL) throws {
        try url.setResourceValue(true, forKey: NSURLIsExcludedFromBackupKey)
    }
}

在您声明网址后的lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {中,您可以添加以下内容:

 do {
            let url = url
            try NSFileManager.defaultManager().addSkipBackupAttributeToItemAtURL(url)

        } catch {
            // Handle error here
            print("Error: \(error)")
        }

答案 4 :(得分:-1)

对上述方法进行更正,将其用于swift

 func addSkipBackupAttributeToItemAtURL(URL:NSURL) ->Bool {

    let fileManager = NSFileManager.defaultManager()
    assert(fileManager.fileExistsAtPath(URL.absoluteString!))

    var error:NSError?
    let success:Bool = URL.setResourceValue(NSNumber(bool: true),forKey: NSURLIsExcludedFromBackupKey, error: &error)

    if !success{

        println("Error excluding \(URL.lastPathComponent) from backup \(error)")
    }

    return success;
}

答案 5 :(得分:-1)

您可以在swift中执行以下操作:

func addSkipBackupAttributeToItemAtPath(path:String) -> Bool {


    let filePath = path.fileSystemRepresentation()
    let attrName  = "com.apple.MobileBackup"

    var attrValue : uint_fast8_t = 1

    let result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue.dynamicType), 0, 0)

    return result == 0
}