2012-01-01 12 views
10

haciendo referencia a iCloud + Storage of media in iPhone Documents folder, que muestra cómo configurar el atributo "No hacer copia de seguridad" iOS 5.0.1 para un archivo.Agregar el atributo "No hacer copia de seguridad" a una jerarquía de carpetas en iOS 5.0.1

¿Hay una forma eficiente de hacer esto para una jerarquía completa de carpetas/archivos? Por ejemplo, mi aplicación crea/Library/PrivateDocs y la completa con varias carpetas, subcarpetas y archivos. ¿Puedo simplemente configurar el atributo do-not-backup en la carpeta de nivel superior, o debo configurarlo en cada archivo y carpeta individual debajo de eso también?

Y, si debe configurarse en cada archivo/subcarpeta, ¿cuál es una forma eficiente de hacerlo?

Respuesta

25

Se puede poner un directorio específico dentro de los documentos dir para este fin, poner todo en casa y marcar ese directorio solo como personas que no desean copia de seguridad mediante la

addSkipBackupAttributeToItemAtURL 

método que se muestra en el artículo se ha vinculado, o utilizar éste que utiliza una ruta en lugar de una dirección URL:

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

ejemplo usando un directorio:

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

[Utilities addSkipBackupAttributeToPath:yourContentsDirPath]; 

[EDIT]

me olvidó este uso en el método de la delegada para obtener la documentación dir:

- (NSString *)applicationDocumentsDirectory { 

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

Gracias - ¡así es como esperaba que funcionara! –

+2

Tuve que incluir #include en la antigua SDK 4.3 APP. – PetrV

+1

¿Llamo abierta a esta aplicación una vez? o cada vez que escribo en la carpeta? – box86rowh

6

Para todos mis amigos aquí, que necesita en Swift - con tan sólo mirar a continuación (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; 

} 
+0

esto arroja un error en swift 2 en línea: deja éxito: Bool = URL.setResourceValue (NSNumber.numberWithBool (true), forKey: NSURLIsExcludedFromBackupKey, error: & error) // argumento extra 'error' en la llamada –

+0

tienes razón cambiado en swift 2.1 - no hay más atributo de error ahora – kurtanamo

+0

He actualizado el código para cualquier persona que use swift 2 en una respuesta a continuación –

-1

de corrección en método anterior, utilizar este para 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; 
} 
2

Para mí, en Swift, las funciones respondidas anteriormente no funcionaron del todo. En particular, la línea afirmativa falló. ¡Necesitaba actualizarlo desde URL.absoluteString! a URL.path! Así que al final la mina se parece a esto:

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; 
} 
-1

puede hacer lo siguiente en 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 
} 
1

tal vez esto podría ayudar a alguien que use rápida 2:

Justo antes @UIApplicationMain añadir lo siguiente:

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

En su lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { después de usted declare su URL puede agregar esto:

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

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