2015-09-04 3 views
1

Здравствуйте, я обновляю свой существующий код до Swift 2, и мне нужна помощь с копией файла внутри DocumentDirectoy.NSFileManager fileExistsAtPath не может перезаписать существующий файл в Swift 2

Это преобразованный код, который я использую, чтобы проверить, существует ли файл, и если это так, мы должны скопировать его в любом случае, но он продолжает возвращать ошибку, указывающую, что файл существует, что это правда, но нам нужно чтобы перезаписать его.

func copyXMLFile() 
    { 
    // Get a reference for the Document directory 
    let rootPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, .UserDomainMask, true)[0] 
    // Get a reference for the data.xml file 
    xmlPathInDocument = rootPath.stringByAppendingString("data.xml") 
    if NSFileManager.defaultManager().fileExistsAtPath(xmlPathInDocument){ 
     print("xml file exists") 

       let xmlPathInBundle = NSBundle.mainBundle().pathForResource("data", ofType: "xml")! 
     do { 
      // copy file from main bundle to documents directory 
      print("copy") 
      try NSFileManager.defaultManager().copyItemAtPath(xmlPathInBundle, toPath: xmlPathInDocument) 
     } catch let error as NSError { 
      // Catch fires here, with an NSErrro being thrown 
      print("error occurred, here are the details:\n \(error)") 
     } 
    } 
    else 
    { 
     // copy the file either way 

     let xmlPathInBundle = NSBundle.mainBundle().pathForResource("data", ofType: "xml")! 
     do { 
      // copy file from main bundle to documents directory 
      print("copy") 
      try NSFileManager.defaultManager().copyItemAtPath(xmlPathInBundle, toPath: xmlPathInDocument) 
     } catch let error as NSError { 
      // Catch fires here, with an NSErrro being thrown 
      print("error occurred, here are the details:\n \(error)") 
     } 

    } 

} 

произошла ошибка, вот детали:

Error Domain=NSCocoaErrorDomain Code=516 "The operation couldn’t be completed. (Cocoa error 516.)" UserInfo=0x7a67b680 {NSSourceFilePathErrorKey=/Users/User1/Library/Developer/CoreSimulator/Devices/0E591E5B-2E2F-4CCB-9099-95CE1EA3F557/data/Containers/Bundle/Application/E3C8FAE4-703D-46CA-AC37-A1C96A74E6BE/myApp.app/data.xml, NSUserStringVariant=( Copy), NSFilePath=/Users/User1/Library/Developer/CoreSimulator/Devices/0E591E5B-2E2F-4CCB-9099-95CE1EA3F557/data/Containers/Bundle/Application/E3C8FAE4-703D-46CA-AC37-A1C96A74E6BE/myApp.app/data.xml, NSDestinationFilePath=/Users/User1/Library/Developer/CoreSimulator/Devices/0E591E5B-2E2F-4CCB-9099-95CE1EA3F557/data/Containers/Data/Application/09F690B3-BDD8-4482-ADDE-E33F30D4B873/Documentsdata.xml, NSUnderlyingError=0x7a67dd80 "The operation couldn’t be completed. File exists"}

Пожалуйста, помогите!

ответ

2

Реализовать NSFileManagerDelegate и метод делегата

optional func fileManager(_ fileManager: NSFileManager, 
    shouldProceedAfterError error: NSError, 
     copyingItemAtURL srcURL: NSURL, 
        toURL dstURL: NSURL) -> Bool 

и вернуть true

В качестве альтернативы можно использовать

func replaceItemAtURL(_ originalItemURL: NSURL, 
       withItemAtURL newItemURL: NSURL, 
      backupItemName backupItemName: String?, 
         options options: NSFileManagerItemReplacementOptions, 
      resultingItemURL resultingURL: AutoreleasingUnsafeMutablePointer<NSURL?>) throws 
+0

Спасибо @vadian, второй вариант помог! – AJ152

+0

При тестировании моего приложения в IOS Simulator процесс копирования файлов работает нормально, но когда я тестирую на своем устройстве iPhone, я получаю сообщение об ошибке: 'Error Domain = NSCocoaErrorDomain Code = 513" Операция не может быть выполнена. (Cocoa error 513.) «UserInfo = 0x17e8af80 {NSUnderlyingError = 0x17e89210« Операция не может быть выполнена. Операция не разрешена », NSFilePath =/private/var/mobile/Контейнеры/Пакет/Приложение/A44E5FF5-F52A-45E7-A803 -DB6A19F1DB82/myApp.app/data.xml' – AJ152

+0

Это потому, что я запускаю свое приложение на iPhone с помощью боковой нагрузки Xcode 7? @vadian – AJ152

Смежные вопросы