Iphone 加入「;“不备份”;iOS 5.0.1中文件夹层次结构的属性

Iphone 加入「;“不备份”;iOS 5.0.1中文件夹层次结构的属性,iphone,ios,Iphone,Ios,引用,显示如何为文件设置iOS 5.0.1“不备份”属性 对于整个文件夹/文件层次结构,是否有一种有效的方法来执行此操作?例如,我的应用程序创建/Library/PrivateDocs,并使用多个文件夹、子文件夹和文件填充它们。我可以只在顶级文件夹上设置“不备份”属性,还是必须在该文件夹下的每个文件和文件夹上都设置该属性 而且,如果必须在每个文件/子文件夹上设置该目录,那么什么是有效的方法?为此,您可以在documents目录中放置一个特定的目录,将所有内容都放在其中,并使用 addSkipB

引用,显示如何为文件设置iOS 5.0.1“不备份”属性

对于整个文件夹/文件层次结构,是否有一种有效的方法来执行此操作?例如,我的应用程序创建/Library/PrivateDocs,并使用多个文件夹、子文件夹和文件填充它们。我可以只在顶级文件夹上设置“不备份”属性,还是必须在该文件夹下的每个文件和文件夹上都设置该属性


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

为此,您可以在documents目录中放置一个特定的目录,将所有内容都放在其中,并使用

 addSkipBackupAttributeToItemAtURL
方法,或使用此方法使用路径而不是URL:

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

对于所有需要使用Swift的朋友,请看下面(iOS8.0)


对上述方法的修正,用于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;
}

对我来说,在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;
}

您可以在
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
}

也许这会对使用swift 2的人有所帮助:

@UIApplicationMain
之前添加以下内容:

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

        } catch {
            // Handle error here
            print("Error: \(error)")
        }
在您的
lazy var persistentstorecordinator:nspersistentstorecordinator?={
声明URL后,可以添加以下内容:

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

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

我必须将#include包含在较旧的SDK 4.3应用程序中。我是在应用程序打开时调用此选项吗?还是每次写入文件夹时调用此选项?如果您解决了问题,请简要解释。在应用程序打开时调用此选项?还是每次。您在创建文件夹时调用此选项。您不必每次都设置此选项。仅一次。此选项是否也适用于隐藏文件夹?如果我们启用“外部存储"核心数据模型中二进制数据字段上的标记,核心数据将在与数据库相同的文件夹中创建一个隐藏文件夹。遗憾的是,您无法在创建的隐藏文件夹上使用此技术设置此属性。如果我们将此属性移到比数据库所在位置高一个级别,并设置“不备份”标记,则它也将完全传播到隐藏文件夹还有文件夹?这会在swift 2中引发一个错误:let success:Bool=URL.setResourceValue(NSNumber.numberWithBool(true),forKey:nsurliseCludedFromBackupKey,error:&error)//调用中的额外参数'error'您是对的,它在swift 2.1中更改了-现在没有更多错误属性我已在下面的回答中更新了使用swift 2的任何人的代码