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