web-dev-qa-db-fra.com

Enregistrer le fichier dans le répertoire du document dans Swift 3?

Je sauvegarde des fichiers dans un répertoire de documents dans Swift 3 avec ce code:

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

Mais comme vous pouvez le constater, je n’utilise pas filemanager pour obtenir le chemin du répertoire de documents, car filemanager donne uniquement une URL et non une chaîne.

Des questions:

  • Comment obtenir une chaîne du gestionnaire de fichiers? 
  • Y at-il une chance de crash dans mon code?
19
TechGuy

S'il vous plaît pensez le contraire. 

URL est le moyen recommandé de gérer les chemins de fichiers car il contient toutes les méthodes pratiques pour ajouter et supprimer des composants de chemin et des extensions - plutôt que String auquel Apple a supprimé ces méthodes.

Il est déconseillé de concaténer des chemins tels que path = path + name. Il est sujet aux erreurs car vous êtes responsable de tous les séparateurs de chemin de barre oblique.

De plus, vous n'avez pas besoin de créer un fichier avec FileManager. Data a une méthode pour écrire des données sur le disque.

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
49
vadian

suivant l'exemple donné par vadian ci-dessus, la seule ligne nécessaire pour enregistrer un fichier (de données) dans le répertoire de documents est la suivante: 

essayez imageData.write (to: fileURL)

Obtenir le chemin du fichier est la partie intéressante

ex: créer le chemin du fichier

 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
}

appeler la fonction:

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

J'utilise la méthode suivante pour créer le fichier "Test.txt". J'espère que ça vous aide.

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