/// <summary> /// Sauvegarde l'instance du manager de contact en utilisant la méthode de /// sérialisation spécifiée. /// </summary> /// <param name="serialisationMethod">La méthode de sérialisation à utiliser pour la sérialisation.</param> private void SaveToFile(string serialisationMethod) { string filePath = GetFilePath(); Console.WriteLine("Ajoutez un mot de passe (Peut être vide, utilisera le SID): "); string password = Console.ReadLine(); byte[] encryptionKey = ContactManagerCryptography.GetKeyFromPassword(password); try { IContactManagerSerializer serializer = SerializerFactory.Create(serialisationMethod); using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) { using (CryptoStream cryptoStream = ContactManagerCryptography.EncryptionStream(encryptionKey, fileStream)) { serializer.Serialize(cryptoStream, _contactManager); Console.WriteLine($"Contacts sauvegardés dans: \"{filePath}\""); } } } catch (SerializationException e) { Console.WriteLine($"Erreur de sauvegarde: {e.Message}"); } catch (ArgumentException) { Console.WriteLine("Type de sérialisation invalide."); } }
/// <summary> /// Charge une instance du manager de contact. /// </summary> /// <param name="deserializationMethod">La méthode de déserialisation à utiliser</param> private void LoadFromFile(string deserializationMethod) { string filePath = GetFilePath(); if (!File.Exists(filePath)) { Console.Error.WriteLine("Le fichier de base n'existe pas."); return; } Console.WriteLine("Entrez le mot de passe :"); string password = Console.ReadLine(); byte[] decryptionKey = ContactManagerCryptography.GetKeyFromPassword(password); try { IContactManagerSerializer deserializer = SerializerFactory.Create(deserializationMethod); using (FileStream fileStream = new FileStream(filePath, FileMode.Open)) { using (CryptoStream cryptoStream = ContactManagerCryptography.DecryptionStream(decryptionKey, fileStream)) { _contactManager = deserializer.Deserialize(cryptoStream); _contactManager.RemakeTree(_contactManager.RootFolder); _contactManager.CurrentFolder = _contactManager.RootFolder; Console.WriteLine($"Contacts chargés depuis: \"{filePath}\""); _passwordTries = 0; } } } catch (Exception e) when( e is SerializationException || e is CryptographicException) { Console.Error.WriteLine($"Le chargement a échoué: Le mot de passe est incorrect.\n" + $"Nombre d'essais: {++_passwordTries}, Essais restants: {MAX_PASSWORD_TRIES - _passwordTries}"); if (_passwordTries >= MAX_PASSWORD_TRIES) { Console.Error.WriteLine("Le nombre d'essais maximum a été dépassé. Le fichier va être supprimé."); File.Delete(filePath); _passwordTries = 0; } } catch (ArgumentException) { Console.WriteLine("Type de sérialisation invalide"); } }