tutorial the programming language kits for developer apple ios xcode swift

ios - the - ¿Cómo verificar si existe un archivo en el directorio de Documentos en Swift?



xcode for windows (8)

¿Cómo verificar si existe un archivo en el directorio de Documentos en Swift ?

Estoy usando el método [ .writeFilePath ] para guardar una imagen en el directorio de Documentos y quiero cargarla cada vez que se inicia la aplicación. Pero tengo una imagen predeterminada si no hay una imagen guardada.

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

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

Aclamaciones


Debe agregar una barra diagonal "/" antes del nombre del archivo, o obtendrá una ruta como "... / DocumentsFilename.jpg"


Es bastante fácil de usar. Simplemente trabaje con singleton de administrador predeterminado de NSFileManager y luego use el método fileExistsAtPath() , que simplemente toma una cadena como argumento y devuelve un Bool, lo que permite colocarlo 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 cuenta que Downcast para String no es necesario en Swift 2.


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

Para obtener el directorio 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 se garantiza que este directorio estándar existe.

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

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

Ahora compruebe si el archivo 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 tirar

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

Para considerar solo el valor de retorno booleano e ignorar el error, utilice el operador de nulo coalescencia

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


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


Para el beneficio de los principiantes de Swift 3 :

  1. Swift 3 ha eliminado la mayoría de la sintaxis NextStep
  2. Por lo tanto 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 archivo llamado "database.sqlite" en el directorio 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)") } }


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

  1. Usar URL en lugar de FileManager
  2. Uso de manejo de 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)") } }


Verifique 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"); }


Versión Swift 4.x

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

Versión Swift 3.x

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") }

La versión de Swift 2.x 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") }