ios swift nsfilemanager

ios - Swift 3.0 FileManager.fileExists(atPath:) siempre devuelve false



nsfilemanager (5)

  1. Primero, ¿cómo se ve tu ruta de archivo? Si la ruta comienza con un ~, debe expandirse con la expandingTildeInPath ;
  2. Compruebe si la ruta es inaccesible para su aplicación. La aplicación iOS solo puede visitar sus directorios de sandbox.

Cuando uso el método .fileExists(atPath:) para juzgar si el archivo existe en el sistema de archivos, el método siempre me devuelve falso. Revisé el sistema de archivos y el archivo existe. Aquí está mi código:

let filePath = url?.path var isDir : ObjCBool = false if(self.fileManager.fileExists(atPath: filePath!, isDirectory: &isDir)){ let result = NSData(contentsOfFile: filePath!) }

o

let filePath = url?.path if(self.fileManager.fileExists(atPath: filePath!)){ let result = NSData(contentsOfFile: filePath!) }

La cláusula if siempre será omitida.


Asumo que tu url es un tipo de URL . Si es así, prueba esto:

let filePath = url?.path // always try to work with URL when accessing Files if(FileManager.default.fileExists(atPath: filePath!)){ // just use String when you have to check for existence of your file let result = NSData(contentsOf: url!) // use URL instead of String }

Diciendo lo suficiente, deberías cambiar tu implementación de esta manera:

if(FileManager.default.fileExists(atPath: (url?.path)!)){ // just use String when you have to check for existence of your file let result = NSData(contentsOf: url!) // use URL instead of String }

EDITAR: 1

Hay una forma aún mejor, puede llamarlo de manera rápida (: D). No tienes que verificar explícitamente la existencia de un archivo .

guard let result = NSData(contentsOf: fileURL) else { // No data in your fileURL. So no data is received. Do your task if you got no data // Keep in mind that you don''t have access to your result here. // You can return from here. return } // You got your data successfully that was in your fileURL location. Do your task with your result. // You can have access to your result variable here. You can do further with result constant. print(result)


Quiero compartir mi experiencia, en caso de que alguien más quede desconcertado por esto.

Probado en iOS 10-11, Xcode 9.2 y Swift 3.2.

Respuesta corta: si guarda una ruta de archivo en el disco, puede resolverla sin incluir el directorio Documentos en él. En su lugar, cada vez que necesite recuperar el archivo con la ruta guardada, obtenga el directorio Documentos y agregue la ruta.

Para una aplicación de iOS, estaba guardando una imagen en ... / Documentos / Imágenes a través de la URL relativa, digamos url . A medida que se guardaba la imagen, también se guardaba una ruta, digamos url.path , en una entidad Core Data.

Cuando más tarde intenté recuperar la imagen a través de FileManager.default.fileExists(atPath: url.path) , siempre devolvía falso.

Estaba probando la aplicación en mi iPhone. Resultó que, por alguna razón, cada vez que ejecutaba la aplicación desde Xcode, ¡la carpeta del identificador de la aplicación cambiaba!

Asi que:

  • Aplicación abierta desde Xcode -> Imagen guardada -> aplicación cerrada -> aplicación abierta desde dispositivo físico -> fileExists -> TRUE
  • Aplicación abierta desde Xcode -> Imagen guardada -> aplicación cerrada -> aplicación abierta desde Xcode -> fileExists -> FALSE

Puede verificar si este es su caso obteniendo e imprimiendo la ruta de la carpeta del documento (o URL, no importa) y comparándola con la ruta guardada (o URL). Si consigues algo como esto:

  • / var / mobile / Containers / Data / Application / 5D4632AE-C432-4D37-A3F7-ECD05716AD8A / Documents ...
  • / var / mobile / Containers / Data / Application / D09904C3-D80D-48EB-ACFB-1E42D878AFA4 / Documents ..

Has encontrado el problema.


en swift 3 solo en caso de que alguien se confunda como yo, he aquí los fragmentos completos:

let str = "file:///Users/martian2049/Library/Developer/CoreSimulator/Devices/67D744AA-6EEC-4AFD-A840-366F4D78A18C/data/Containers/Data/Application/DD96F423-AF9F-4F4D-B370-94ADE7D6D0A5/Documents/72b8b0fb-7f71-7f31-ac9b-f9cc95dfe90d.mp3" let url = URL(string: str) print(url!.path,"/n") if FileManager.default.fileExists(atPath: url!.path) { print("FILE Yes AVAILABLE") } else { print("FILE NOT AVAILABLE") }

esto imprime

/Users/martian2049/Library/Developer/CoreSimulator/Devices/67D744AA-6EEC-4AFD-A840-366F4D78A18C/data/Containers/Data/Application/DD96F423-AF9F-4F4D-B370-94ADE7D6D0A5/Documents/72b8b0fb-7f71-7f31-ac9b-f9cc95dfe90d.mp3 FILE Yes AVAILABLE

Observe cómo el '' file:// '' se cortó?


let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true); var path = paths[0] as String; path = path + "/YourFilePath" if((NSFileManager.defaultManager().fileExistsAtPath(path))) { let result = NSData(contentsOfFile: filePath!)}

Prueba el código anterior y vuelve a comprobar