【问题标题】:Adding the "Do Not Backup" attribute to a folder hierarchy in iOS 5.0.1在 iOS 5.0.1 中将“不备份”属性添加到文件夹层次结构
【发布时间】:2012-01-01 16:23:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone ios


    【解决方案1】:

    为此,您可以在文档目录中放置一个特定目录,将所有内容都放入其中,然后仅使用

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

    【讨论】:

    • 我必须在旧版 SDK 4.3 APP 中包含 #include
    • 我会在应用打开时调用一次吗?还是每次我写入文件夹?
    • 如果你解决了问题。然后在应用打开时简要解释一下。或每次。
    • 创建文件夹时调用它。您不必每次都设置它。只有一次。
    • 这对隐藏文件夹也有效吗?如果我们在核心数据模型中的二进制数据字段上启用“外部存储”标志,核心数据将在与您的数据库相同的文件夹中创建一个隐藏文件夹。不幸的是,您无法在创建的隐藏文件夹上使用此技术设置此属性。如果我们比数据库所在的位置高一级并设置不备份标志,它是否也会完全传播到隐藏文件夹?
    【解决方案2】:

    对于所有需要 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;
    
    }
    

    【讨论】:

    • this 在 swift 2 in line 中抛出错误: let success:Bool = URL.setResourceValue(NSNumber.numberWithBool(true),forKey: NSURLIsExcludedFromBackupKey, error: &error) //Extra argument 'error' in打电话
    • 你是对的,它在 swift 2.1 中改变了 - 现在不再有错误属性
    • 我已经在下面的答案中为任何使用 swift 2 的人更新了代码
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      也许这会对使用 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)")
              }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          以上方法更正,快速使用此方法

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-10-13
            • 2011-01-24
            • 1970-01-01
            • 2011-09-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多