Introduction au travail avec le système de fichiers en Swift
Le développement pour iOS et macOS nécessite souvent une interaction avec le système de fichiers de l'appareil. Que ce soit pour sauvegarder des données utilisateur, mettre en cache des images ou exporter des documents — savoir travailler avec des fichiers et dossiers est une compétence essentielle pour tout développeur Swift. Dans cet article, nous allons détailler comment utiliser FileManager, URL et Data pour effectuer toutes les opérations de base avec le système de fichiers.
Nous aborderons la création, la lecture, l'écriture et la suppression de fichiers, ainsi que la navigation dans les répertoires. Tous les exemples de code sont écrits en Swift 5 et conviennent aussi bien pour les projets iOS que macOS.
Composants principaux : FileManager et URL
En Swift, la classe centrale pour travailler avec le système de fichiers est FileManager. Elle fournit des méthodes pour gérer les fichiers, les répertoires et leurs attributs. Pour spécifier les chemins, on utilise la structure URL, qui est une alternative plus sûre et moderne aux chaînes de caractères.
Obtention des répertoires standards
La première chose à savoir est comment obtenir les chemins vers les répertoires système standards. Pour iOS, ce sont généralement Documents, Library/Caches et tmp.
import Foundation
let fileManager = FileManager.default
// Répertoire Documentsguard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { fatalError("Impossible d'obtenir le répertoire Documents")}print("Documents: \\(documentsURL.path)")
// Répertoire Cachesguard let cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first else { fatalError("Impossible d'obtenir le répertoire Caches")}print("Caches: \\(cachesURL.path)")
// Répertoire temporairelet tempURL = fileManager.temporaryDirectoryprint("Temp: \\(tempURL.path)")Création et écriture de fichiers
La création d'un fichier en Swift est une combinaison de création de chemin et d'écriture de données. Examinons deux approches principales.
Écriture de données textuelles
func createTextFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("example.txt") let content = "Bonjour le monde ! Ceci est un fichier de test." do { try content.write(to: fileURL, atomically: true, encoding: .utf8) print("Fichier créé avec succès au chemin : \\(fileURL.path)") } catch { print("Erreur d'écriture du fichier : \\(error.localizedDescription)") }}Écriture de données binaires (images, archives)
func createBinaryFile() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let fileURL = documentsURL.appendingPathComponent("data.bin") let data = Data([0x48, 0x65, 0x6C, 0x6C, 0x6F]) // "Hello" en hex do { try data.write(to: fileURL, options: .atomic) print("Fichier binaire créé") } catch { print("Erreur : \\(error)") }}Création de répertoires
func createDirectory() { guard let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return } let newDirURL = documentsURL.appendingPathComponent("MyFolder") do { try fileManager.createDirectory(at: newDirURL, withIntermediateDirectories: true, attributes: nil) print("Répertoire créé : \\(newDirURL.path)") } catch { print("Erreur de création du répertoire : \\(error)") }}Lecture et vérification des fichiers
Une fois les fichiers créés, il faut savoir les lire et vérifier leur existence.
Vérification de l'existence d'un fichier
func fileExists(at url: URL) -> Bool { return fileMan