color change bar ios swift nsfilemanager nsdocumentdirectory

ios - swift 3 change navigation bar title color



¿Guardar archivo en el directorio de documentos en swift 3? (4)

Estoy guardando archivos en un directorio de documentos en swift 3 con este código:

fileManager = FileManager.default // let documentDirectory = fileManager?.urls(for: .documentDirectory, in: .userDomainMask).first as String var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String path = path + name let image = #imageLiteral(resourceName: "Notifications") let imageData = UIImageJPEGRepresentation(image, 0.5) let bool = fileManager?.createFile(atPath: path, contents: imageData, attributes: nil) print("bool is /(bool)") return true

Pero como puede ver, no estoy usando el filemanager de filemanager para obtener la ruta del directorio del documento, ya que el administrador de filemanager solo proporciona la URL y no la cadena.

Preguntas:

  • ¿Cómo obtener una cadena desde el administrador de archivos?
  • ¿Hay alguna posibilidad de bloqueo en mi código?

Por favor, piensa al revés.

URL es la forma recomendada de manejar las rutas de los archivos porque contiene todos los métodos convenientes para agregar y eliminar componentes y extensiones de la ruta, en lugar de la String cual Apple ha eliminado esos métodos.

No se recomienda que concatene rutas como path = path + name . Es propenso a errores porque usted es responsable de todos los separadores de ruta de barra diagonal.

Además, no es necesario crear un archivo con FileManager . Data tienen un método para escribir datos en el disco.

let fileManager = FileManager.default do { let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false) let fileURL = documentDirectory.appendingPathComponent(name) let image = #imageLiteral(resourceName: "Notifications") if let imageData = UIImageJPEGRepresentation(image, 0.5) { try imageData.write(to: fileURL) return true } } catch { print(error) } return false


Uso el siguiente método para crear el archivo "Test.txt". Espero que te ayude.

func createFile() { let fileName = "Test" let DocumentDirURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true) let fileURL = DocumentDirURL.appendingPathComponent(fileName).appendingPathExtension("txt") print("File PAth: /(fileURL.path)") }


func copyandpast () {

var path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true); let dbpath :NSString = path[0] as NSString; let strdbpath = dbpath.strings(byAppendingPaths: ["mydb.db"])[0] ; print(strdbpath); let fmnager = FileManager.default; if !fmnager.fileExists(atPath: strdbpath) { let local = Bundle.main.path(forResource: "mydb", ofType: "db"); do { try fmnager.copyItem(atPath: local!, toPath: strdbpath) }catch{ } } }


siguiendo el ejemplo anterior dado por vadian, la única línea que necesita para guardar un archivo (Datos) en el Directorio de Documentos es:

prueba imageData.write (to: fileURL)

Conseguir la ruta del archivo es la parte interesante.

ej: crear la ruta del archivo

func createNewDirPath( )->URL{ let dirPathNoScheme = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String //add directory path file Scheme; some operations fail w/out it let dirPath = "file:///(dirPathNoScheme)" //name your file, make sure you get the ext right .mp3/.wav/.m4a/.mov/.whatever let fileName = "thisIsYourFileName.mov" let pathArray = [dirPath, fileName] let path = URL(string: pathArray.joined(separator: "/")) //use a guard since the result is an optional guard let filePath = path else { //if it fails do this stuff: return URL(string: "choose how to handle error here")! } //if it works return the filePath return filePath }

llamar a la función:

let shinnyNewURLpath = createNewDirPath( ) //write data to file using one line in do/catch operation do { try yourDataObject?.write(to: shinnyNewURLpath) } catch { print("catch error",error.localizedDescription) }