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 :
- Swift 3 ha eliminado la mayoría de la sintaxis NextStep
- Por lo tanto NSURL, NSFilemanager, NSSearchPathForDirectoriesInDomain ya no se utilizan
- En su lugar, use URL y FileManager
- NSSearchPathForDirectoriesInDomain no es necesario
- 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:
- Usar URL en lugar de FileManager
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")
}