引用iCloud + Storage of media in iPhone Documents folder,其中显示了如何为文件设置iOS 5.0.1“不备份”属性。
是否有一种有效的方法可以对整个文件夹/文件层次结构执行此操作?例如,我的应用程序创建/ Library / PrivateDocs,并使用多个文件夹,子文件夹和文件填充它。我可以在顶级文件夹中设置do-not-backup属性,还是必须在其下的每个文件和文件夹上设置?
而且,如果必须在每个文件/子文件夹上设置,那么这样做的有效方法是什么?
答案 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
}