¿Cómo verificar si existe un file en el directory de documentos en Swift?

¿Cómo verificar si existe un file en el directory de documentos en Swift ?

Estoy usando el método [ .writeFilePath ] para save una image en el directory de documentos y quiero cargarla cada vez que se inicia la aplicación. Pero tengo una image pnetworkingeterminada si no hay una image guardada.

Pero no puedo entender cómo utilizar la [ func fileExistsAtPath(_:) ] . ¿Podría alguien dar un ejemplo de uso de la function con un argumento de ruta pasado en él?

Creo que no necesito pegar ningún código porque es una pregunta genérica. Cualquier ayuda será muy apreciada.

Aclamaciones

Versión Swift 2.0 , necesita usar URLByAppendingPathComponent

  let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String let url = NSURL(fileURLWithPath: path) let filePath = url.URLByAppendingPathComponent("nameOfFileHere").path! let fileManager = NSFileManager.defaultManager() if fileManager.fileExistsAtPath(filePath) { print("FILE AVAILABLE") } else { print("FILE NOT AVAILABLE") } 

Versión Swift 3.0

  let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String let url = URL(fileURLWithPath: path) let filePath = url.appendingPathComponent("nameOfFileHere").path let fileManager = FileManager.default if fileManager.fileExists(atPath: filePath) { print("FILE AVAILABLE") } else { print("FILE NOT AVAILABLE") } 

Consulte el siguiente código:

Swift 1.2

 let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String let getImagePath = paths.stringByAppendingPathComponent("SavedFile.jpg") let checkValidation = NSFileManager.defaultManager() if (checkValidation.fileExistsAtPath(getImagePath)) { println("FILE AVAILABLE"); } else { println("FILE NOT AVAILABLE"); } 

Swift 2.0

 let paths = NSURL(fileURLWithPath: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]) let getImagePath = paths.URLByAppendingPathComponent("SavedFile.jpg") let checkValidation = NSFileManager.defaultManager() if (checkValidation.fileExistsAtPath("\(getImagePath)")) { print("FILE AVAILABLE"); } else { print("FILE NOT AVAILABLE"); } 

Hoy en día (2016) Apple recomienda cada vez más utilizar la API relacionada con URL de NSURL , NSFileManager , etc.

Para get el directory de documentos en iOS y Swift 2 use

 let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) 

El try! es seguro en este caso porque este directory estándar está garantizado para existir.

A continuación, agregue el componente de ruta apropiado, por ejemplo, un file sqlite

 let databaseURL = documentDirectoryURL.URLByAppendingPathComponent("MyDataBase.sqlite") 

Ahora verifique si el file existe con checkResourceIsReachableAndReturnError de NSURL .

 let fileExists = databaseURL.checkResourceIsReachableAndReturnError(nil) 

Si necesita el error, pase el puntero NSError al parámetro.

 var error : NSError? let fileExists = databaseURL.checkResourceIsReachableAndReturnError(&error) if !fileExists { print(error) } 

Swift 3:

En Swift 3 checkResourceIsReachable está marcado como puede lanzar

 do { let fileExists = try databaseURL.checkResourceIsReachable() // handle the boolean result } catch let error as NSError { print(error) } 

Para considerar solo el valor de retorno boolean e ignorar el error, use el operador nil-coalescing

 let fileExists = (try? databaseURL.checkResourceIsReachable()) ?? false 

Es bastante fácil de usar. Solo trabaja con NSFileManager's defaultManager singleton y luego usa el método fileExistsAtPath() , que simplemente toma una cadena como argumento y devuelve un Bool, lo que permite que se coloque directamente en la instrucción if.

 let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) let documentDirectory = paths[0] as! String let myFilePath = documentDirectory.stringByAppendingPathComponent("nameOfMyFile") let manager = NSFileManager.defaultManager() if (manager.fileExistsAtPath(myFilePath)) { // it's here!! } 

Tenga en count que Downcast a String no es necesario en Swift 2.

Un patrón de código alternativo / recomendado en Swift 3 sería:

  1. Use URL en lugar de FileManager
  2. Uso de event handling excepciones

     func verifyIfSqliteDBExists(){ let docsDir : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let dbPath : URL = docsDir.appendingPathComponent("database.sqlite") do{ let sqliteExists : Bool = try dbPath.checkResourceIsReachable() print("An sqlite database exists at this path :: \(dbPath.path)") }catch{ print("SQLite NOT Found at :: \(strDBPath)") } } 

Para el beneficio de Swift 3 principiantes:

  1. Swift 3 ha eliminado la mayoría de la syntax de NextStep
  2. Entonces, NSURL, NSFilemanager, NSSearchPathForDirectoriesInDomain ya no se utilizan
  3. En su lugar, use URL y FileManager
  4. NSSearchPathForDirectoriesInDomain no es necesario
  5. En su lugar, use FileManager.default.urls

Aquí hay un ejemplo de código para verificar si existe un file llamado "database.sqlite" en el directory de documentos de la aplicación:

 func findIfSqliteDBExists(){ let docsDir : URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let dbPath : URL = docsDir.appendingPathComponent("database.sqlite") let strDBPath : String = dbPath.path let fileManager : FileManager = FileManager.default if fileManager.fileExists(atPath:strDBPath){ print("An sqlite database exists at this path :: \(strDBPath)") }else{ print("SQLite NOT Found at :: \(strDBPath)") } } 

Muy simple: si su ruta es una instancia de URL, conviértalo en cadena mediante el método 'ruta'.

  let fileManager = FileManager.default var isDir: ObjCBool = false if fileManager.fileExists(atPath: yourURLPath.path, isDirectory: &isDir) { if isDir.boolValue { //it's a Directory path }else{ //it's a File path } } 

Debe agregar una barra "/" antes del nombre de file, o puede get una ruta como "… / DocumentsFilename.jpg"