2012-01-01 12 views
10

Riferimento a iCloud + Storage of media in iPhone Documents folder, che mostra come impostare l'attributo "Non eseguire il backup" di iOS 5.0.1 per un file.Aggiunta dell'attributo "Non eseguire il backup" a una gerarchia di cartelle in iOS 5.0.1

Esiste un modo efficace per eseguire questa operazione per un'intera cartella/gerarchia di file? Ad esempio, la mia app crea/Library/PrivateDocs e la popola con diverse cartelle, sottocartelle e file. Posso semplicemente impostare l'attributo do-not-backup nella cartella di livello superiore, o deve essere impostato anche su ogni singolo file e cartella?

E, se deve essere impostato su ogni file/sottocartella, quale è un modo efficace per farlo?

risposta

25

Si potrebbe mettere una directory specifica all'interno dei documenti dir per questo scopo, mettere tutto dentro e segnare solo quella singola directory come do-not-backup utilizzando il metodo

addSkipBackupAttributeToItemAtURL 

mostrato in questo articolo si è collegato, o utilizzare questo uno che utilizza un percorso invece di un URL:

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

esempio utilizzando una directory:

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

[Utilities addSkipBackupAttributeToPath:yourContentsDirPath]; 

[EDIT]

ho dimenticato questo metodo l'uso nel delegato per ottenere i documenti dir:

- (NSString *)applicationDocumentsDirectory { 

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

Grazie - è esattamente come speravo funzionasse! –

+2

Ho dovuto includere #include nella precedente APP SDK 4.3. – PetrV

+1

Lo chiamo una volta sull'app aperta? o ogni volta che scrivo nella cartella? – box86rowh

6

Per tutti i miei amici qui, che ha bisogno di Swift - basta guardare sotto (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

questo genera un errore in swift 2 in linea: let successo: Bool = URL.setResourceValue (NSNumber.numberWithBool (true), forKey: NSURLIsExcludedFromBackupKey, errore: & error) // Argomento extra 'error' nella chiamata –

+0

hai ragione cambiato in swift 2.1 - non più attributo errore ora – kurtanamo

+0

Ho aggiornato il codice per chiunque usi swift 2 in una risposta qui sotto –

-1

correzione sul metodo di cui sopra, di utilizzare per una rapida

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

Per me, in Swift, le funzioni precedentemente risolte non hanno funzionato. In particolare, la linea di affermazione è fallita. Avevo bisogno di aggiornarlo da URL.absoluteString! a URL.path! Così, alla fine miniera di simile a questo:

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

è possibile effettuare le seguenti operazioni in 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

forse questo avrebbe aiutato qualcuno che utilizza rapida 2:

Poco prima @UIApplicationMain aggiungere questo:

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

Nel tuo lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { dopo di te Dichiara il tuo URL puoi aggiungere questo:

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

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