Introduction

Documentation technique EasySave v1.0 — ProSoft

Contexte du Projet

Mission ProSoft

Notre équipe a intégré l'éditeur de logiciels ProSoft, une entreprise spécialisée dans le développement de solutions professionnelles. Sous la responsabilité du DSI, nous avons été mandatés pour concevoir et développer EasySave, un logiciel de sauvegarde destiné à s'intégrer dans la Suite ProSoft.

Politique Tarifaire

Prix unitaire : 200 €HT
Maintenance annuelle (5/7, 8h-17h) : 12% du prix d'achat

Projet Fil Rouge

Développement en 3 versions majeures avec livrables progressifs et documentations associées (UML, manuel utilisateur, release notes)

Stack Technique

C# / .NET 10.0
Visual Studio 2022, GitHub, PlantUML

Internationalisation

Code et commentaires en anglais pour les filiales anglophones. Interface utilisateur FR/EN.

Contraintes Imposées par la Direction

Catégorie Exigence
Versioning Gestion de projet via GitHub avec historique complet des modifications et travail en équipe
Qualité du code Absence de redondance (pas de copier-coller), fonctions de taille raisonnable, conventions de nommage respectées
Architecture Code maintenable et évolutif pour faciliter les futures versions et la réactivité aux dysfonctionnements
Documentation Manuel utilisateur (1 page), documentation support, release notes obligatoires
Livrables UML Diagrammes à livrer 24h avant chaque version (Use Case, Séquence, Activité, Classes)

Qu'est-ce qu'EasySave ?

EasySave est un logiciel de sauvegarde professionnel permettant aux utilisateurs de créer et gérer jusqu'à 5 travaux de sauvegarde. L'application supporte les sauvegardes complètes (copie intégrale) et différentielles (fichiers modifiés uniquement), avec une traçabilité complète via des logs JSON journaliers.

Fonctionnalités Principales (v1.0)

Multi-travaux

Gérez jusqu'à 5 travaux de sauvegarde simultanément avec configuration persistante

Sauvegarde Différentielle

Ne copie que les fichiers modifiés depuis la dernière sauvegarde pour optimiser le temps d'exécution

Multilingue (FR/EN)

Interface disponible en français et en anglais avec changement dynamique de langue

Logs Détaillés

Traçabilité complète au format JSON : horodatage, fichiers, taille, temps de transfert

État Temps Réel

Fichier state.json mis à jour en continu pour le monitoring externe

Supports Multiples

Compatible disques locaux, externes et lecteurs réseaux (chemins UNC)

Modes d'Utilisation

Deux modes disponibles
  • Mode interactif : Menu console avec navigation guidée et gestion complète des travaux (création, modification, suppression, exécution)
  • Mode ligne de commande : Exécution directe via arguments pour l'automatisation et les scripts (EasySave.exe 1-3)

Roadmap des Versions

1.0

Version Console (Livrable 1)

Application console complète avec toutes les fonctionnalités de base : gestion des travaux, sauvegardes complètes/différentielles, logs JSON, multilingue.

2.0

Interface Graphique (Livrable 2)

À venir — Migration vers une interface graphique WPF/MAUI tout en conservant la logique métier existante.

3.0

Version Avancée (Livrable 3)

À venir — Fonctionnalités avancées : cryptage, gestion des processus métier, supervision déportée.

Démarche Technique

Du cahier des charges à l'implémentation

Méthodologie de Conception

EasySave a été conçu avec UML (Unified Modeling Language) et le pattern MVC (Model-View-Controller), pour garder une architecture claire et évolutive.

Étapes de Conception

1

Analyse du Cahier des Charges

Identification des exigences fonctionnelles (5 travaux, 2 types de sauvegarde, multilingue) et des exigences techniques (logs JSON, état temps réel, DLL séparée).

2

Diagramme de Cas d'Utilisation

Modélisation des interactions entre l'utilisateur et le système. Identification de 6 cas d'utilisation principaux : Créer, Modifier, Supprimer, Exécuter, Lister les travaux, et Changer la langue.

3

Diagramme de Classes

Définition de l'architecture technique finale avec toutes les classes, leurs attributs, méthodes et relations. Ce diagramme a servi de référence pour l'implémentation du code.

4

Diagramme d'Activité

Représentation du flux global de l'application : démarrage → choix du mode (CLI ou interactif) → boucle de menu → exécution des actions. Ce diagramme a clarifié la logique de navigation.

5

Diagrammes de Séquence

Pour chaque cas d'utilisation, création d'un diagramme de séquence détaillant les interactions entre les objets : Controller → View → Service → Model. Ces diagrammes ont guidé l'implémentation des méthodes.

6

Implémentation MVC

Développement du code C# en respectant strictement le pattern MVC :
Models : BackupJob, JobState, ProgressInfo
Views : ConsoleView, LanguageManager
Controllers : AppController
Services : BackupService (Façade), JobManager, BackupExecutor, StateManager

Stratégie Git

Le projet utilise GitFlow pour la gestion des branches :

  • main : Version stable de production
  • develop : Branche d'intégration des fonctionnalités
  • feature/* : Développement de nouvelles fonctionnalités
  • docs/* : Modifications de la documentation

La librairie EasyLog.dll est dans le même dépôt mais compilée en DLL à part pour pouvoir être réutilisée (y compris dans d'autres projets) et faire évoluer le logging sans toucher à l’application.

Patterns de Conception Utilisés

Façade

BackupService expose une interface simplifiée vers les sous-systèmes (JobManager, BackupExecutor, ConfigurationManager).

Singleton

LanguageManager assure une seule instance pour les traductions dans toute l'application.

Observer

Les événements OnProgressUpdate permettent à la View de réagir aux changements d'état des sauvegardes en temps réel.

MVC

Séparation entre données (Models), affichage (Views) et logique de contrôle (Controllers).

Installation

Prérequis et compilation du projet

Prérequis

.NET 10.0 SDK

Téléchargez et installez le SDK depuis le site officiel Microsoft

Télécharger .NET 10.0

Compilation

Pour générer un exécutable autonome (self-contained), utilisez la commande correspondant à votre plateforme :

PowerShell / CMD
dotnet publish EasySave/EasySave.csproj -c Release -r win-x64 --self-contained true -o ./publish/windows
Terminal (Apple Silicon M1/M2/M3)
dotnet publish EasySave/EasySave.csproj -c Release -r osx-arm64 --self-contained true -o ./publish/macos
Terminal (Intel)
dotnet publish EasySave/EasySave.csproj -c Release -r osx-x64 --self-contained true -o ./publish/macos_intel
Terminal
dotnet publish EasySave/EasySave.csproj -c Release -r linux-x64 --self-contained true -o ./publish/linux

Lancement rapide (développement)

Mode développement
dotnet run --project EasySave

Guide Utilisateur

Utilisation complète de l'interface interactive

Menu Principal

Au lancement sans arguments, EasySave affiche un menu interactif avec 7 options :

Les 7 Options du Menu

Option Fonction Description
[1] Lister les travaux Affiche tous les travaux configurés avec leur ID, nom, source, destination et type
[2] Créer un travail Assistant de création guidé (nom, source, destination, type). Maximum 5 travaux.
[3] Modifier un travail Modifier n'importe quel champ d'un travail existant. Appuyer sur Entrée pour conserver la valeur actuelle.
[4] Supprimer un travail Supprime définitivement un travail après confirmation
[5] Exécuter un travail Lance la sauvegarde avec affichage de progression en temps réel
[6] Changer la langue Basculer entre Français (FR) et Anglais (EN)
[7] Quitter Ferme l'application proprement

[1] Lister les Travaux

Affiche la liste de tous les travaux de sauvegarde configurés :

Liste des travaux
┌────┬─────────────────────┬───────────────────────┬───────────────────────┬──────────────┐
│ ID │ Nom                 │ Source                │ Destination           │ Type         │
├────┼─────────────────────┼───────────────────────┼───────────────────────┼──────────────┤
│  1 │ Sauvegarde Docs     │ C:\Users\Documents    │ D:\Backup\Docs        │ Complète     │
│  2 │ Sauvegarde Photos   │ C:\Users\Pictures     │ D:\Backup\Photos      │ Différentiel │
└────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────┘

[2] Créer un Travail

1

Saisir le nom du travail

Donnez un nom descriptif unique (ex: "Sauvegarde Documents").
Le nom ne doit pas déjà exister.

2

Définir le répertoire source

Entrez le chemin complet du dossier à sauvegarder.
Supports : Disques locaux (C:\), externes (E:\), réseaux (\\server\share)

3

Définir le répertoire destination

Chemin où les fichiers seront copiés. Le dossier sera créé automatiquement s'il n'existe pas.

4

Choisir le type de sauvegarde

1 = Sauvegarde Complète : Copie tous les fichiers
2 = Sauvegarde Différentielle : Copie uniquement les fichiers plus récents que la destination

Limite de travaux

Vous pouvez créer un maximum de 5 travaux de sauvegarde. Supprimez un travail existant si vous avez atteint la limite.

[3] Modifier un Travail

  1. Sélectionnez le numéro du travail à modifier
  2. Pour chaque champ, entrez la nouvelle valeur ou appuyez sur Entrée pour conserver la valeur actuelle
  3. Les modifications sont sauvegardées automatiquement

[4] Supprimer un Travail

  1. Sélectionnez le numéro du travail à supprimer
  2. Confirmez la suppression
  3. Le travail est définitivement supprimé du fichier jobs.json

[5] Exécuter un Travail

Cette option permet de lancer des sauvegardes avec plusieurs formats de sélection :

Format Exemple Description
Travail unique 2 Exécute uniquement le travail n°2
Liste de travaux 1;3;5 Exécute les travaux 1, 3 et 5 séquentiellement
Plage de travaux 1-4 Exécute les travaux de 1 à 4 inclus
Tous les travaux * Exécute tous les travaux configurés
Progression en temps réel

Pendant l'exécution, deux barres de progression s'affichent :
Progression globale : Avancement sur l'ensemble des travaux sélectionnés
Progression du travail : Avancement du travail en cours

[6] Changer la Langue

EasySave supporte deux langues :

  • Français (fr-FR) - Langue par défaut
  • English (en-US)

Le choix est sauvegardé dans Data/settings.json et persiste entre les sessions.

[7] Quitter

Ferme proprement l'application. Toutes les configurations sont automatiquement sauvegardées.

Notes Importantes

Sauvegarde Automatique

Les travaux sont sauvegardés automatiquement après chaque création/modification

Validation des Chemins

Les chemins source et destination sont validés avant la création d'un travail

Logs Automatiques

Chaque transfert est automatiquement enregistré dans Data/Logs/

Différentiel Intelligent

Les sauvegardes différentielles sans fichiers modifiés sont automatiquement ignorées

Ligne de Commande

Exécution directe via arguments

Syntaxe

Format général
EasySave.exe <sélecteur_travaux>

Formats de sélection

Format Description Exemple
N Exécute un seul travail par son ID EasySave.exe 1
N-M Exécute une plage de travaux (de N à M) EasySave.exe 1-3
N;M;O Exécute une liste de travaux spécifiques EasySave.exe 1;3;5

Exemples d'utilisation

Exécuter le travail n°2
./EasySave.exe 2
Exécuter les travaux 1, 2 et 3
./EasySave.exe 1-3
Exécuter les travaux 1, 3 et 5
./EasySave.exe 1;3;5

Conception (UML)

Diagrammes de modélisation du système

Cas d'Utilisation

Diagramme de Cas d'Utilisation

Diagramme de Classes

Diagramme de Classes

Diagramme d'Activité

Diagramme d'Activité

Diagrammes de Séquence

Créer un travail

Séquence Créer un travail

Modifier un travail

Séquence Modifier un travail

Supprimer un travail

Séquence Supprimer un travail

Exécuter un travail

Séquence Exécuter un travail

Lister les travaux

Séquence Lister les travaux

Changer la langue

Séquence Changer la langue

Architecture

Structure du projet et pattern MVC

Qu'est-ce que le Pattern MVC ?

Le pattern Model-View-Controller (MVC) est un patron d'architecture logicielle qui sépare une application en trois composants interconnectés. Cette séparation permet de découpler la représentation interne des données de la façon dont elles sont présentées à l'utilisateur.

Model (Modèle)

Représente les données et la logique métier. Le modèle est indépendant de l'interface utilisateur : il ne sait pas comment les données seront affichées.

Dans EasySave : BackupJob, JobState, BackupType

View (Vue)

Responsable de l'affichage des données à l'utilisateur. La vue observe le modèle et se met à jour quand les données changent. Elle ne contient pas de logique métier.

Dans EasySave : ConsoleView, LanguageManager

Controller (Contrôleur)

Fait le lien entre le Model et la View. Il interprète les actions de l'utilisateur, met à jour le modèle et sélectionne la vue appropriée à afficher.

Dans EasySave : AppController

Pourquoi ce choix architectural ?

Avantage Bénéfice pour EasySave
Séparation des responsabilités Chaque développeur peut travailler sur une couche sans impacter les autres. Le code est plus lisible et maintenable.
Testabilité Les services peuvent être testés indépendamment de l'interface console. On peut mocker la View pour tester le Controller.
Évolutivité Remplacer la ConsoleView par une interface graphique WPF/MAUI (v2.0) ne nécessite aucune modification des Services ou Models.
Réutilisabilité Les models BackupJob et JobState peuvent être réutilisés dans d'autres projets ou API.
Maintenabilité Un bug dans l'affichage ? → Modifier seulement ConsoleView. Un bug dans la logique de sauvegarde ? → Modifier seulement BackupExecutor.

Flux de Données dans EasySave

Voici comment les données circulent entre les différentes couches lors d'une action utilisateur :

1

L'utilisateur interagit avec la View

ConsoleView affiche le menu et capture le choix de l'utilisateur (ex: "5" pour exécuter).

2

Le Controller interprète l'action

AppController reçoit le choix via HandleMenuChoice() et détermine quelle action déclencher.

3

Les Services exécutent la logique métier

BackupService (façade) délègue à BackupExecutor qui copie les fichiers et met à jour le JobState.

4

Les Models sont mis à jour

StateManager persiste le JobState dans state.json. Le Logger écrit les entrées dans le log journalier.

5

La View est notifiée (Observer)

L'événement OnProgressUpdate est déclenché, permettant à ConsoleView de rafraîchir la barre de progression.

Diagramme MVC Simplifié

EasySave implémente une variante du MVC adaptée aux applications console avec une couche Services supplémentaire :

Controllers

AppController.cs

Logique de navigation et orchestration

Models

BackupJob, JobState, BackupType

Définition des données

Views

ConsoleView, LanguageManager

Affichage console multilingue

Services

BackupService, ConfigurationManager, StateManager

Logique métier
Couche Services : Extension du MVC classique

Dans un MVC pur, la logique métier est souvent dans le Controller. Ici, nous avons extrait cette logique dans une couche Services dédiée pour :

  • Éviter les "fat controllers" (contrôleurs trop chargés)
  • Permettre la réutilisation de la logique métier
  • Faciliter les tests unitaires
  • Respecter le principe de responsabilité unique (SRP)

Structure des fichiers

EasySave/
Controllers/
AppController.cs — Contrôleur principal
Models/
BackupJob.cs — Définition d'un travail
JobState.cs — État temps réel
BackupType.cs — Enum (Complete/Differential)
Services/
BackupService.cs — Logique de sauvegarde
ConfigurationManager.cs — Gestion config JSON
StateManager.cs — Gestion état temps réel
Views/
ConsoleView.cs — Interface console
LanguageManager.cs — Gestion multilingue
EasyLog/ — DLL de logging

Modèles de Données

Classes POCO et structures de données du projet

Rôle des Modèles dans l'Architecture

Les modèles (ou Models) représentent les entités métier de l'application. Dans EasySave, ils sont implémentés sous forme de POCO (Plain Old CLR Objects) : des classes simples sans logique complexe, uniquement des propriétés.

POCO (Plain Old CLR Object)

Classes simples sans dépendances framework. Elles ne contiennent que des propriétés get/set et sont facilement sérialisables.

Sérialisation JSON

Grâce aux attributs [JsonPropertyName], les modèles sont automatiquement convertis en JSON pour la persistance (jobs.json, state.json).

Immutabilité partielle

Les propriétés ont des valeurs par défaut (string.Empty) pour limiter les NullReferenceException et garder un état cohérent.

BackupJob

Représente un travail de sauvegarde configuré par l'utilisateur. Cette classe est persistée dans jobs.json et chargée au démarrage de l'application.

BackupJob
Propriété Type Description
Id int Identifiant unique (1 à 5)
Name string Nom du travail
SourceDirectory string Chemin du répertoire source
TargetDirectory string Chemin du répertoire destination
Type BackupType Complete ou Differential

JobState

Représente l'état temps réel d'une sauvegarde en cours d'exécution. Cette classe est mise à jour à chaque fichier copié et persistée dans state.json pour permettre un suivi externe (ex: application de monitoring).

JobState
Propriété Type Description
JobName string Nom du travail en cours
State string Active, Inactive, Finished, Error
TotalFiles int Nombre total de fichiers
TotalSize long Taille totale en octets
FilesRemaining int Fichiers restants à copier
Progression double Pourcentage (0-100)
Méthode CalculateProgression()

La classe JobState contient une méthode CalculateProgression() qui calcule automatiquement le pourcentage d'avancement à partir du nombre de fichiers restants :

Progression = ((TotalFiles - FilesRemaining) / TotalFiles) × 100

BackupType (Enum)

Définit le type de sauvegarde à effectuer. Le choix du type impacte directement le comportement de BackupExecutor lors de la copie des fichiers.

Complete Copie intégrale de tous les fichiers du répertoire source vers la destination, qu'ils existent déjà ou non.
Differential Copie uniquement les fichiers dont la date de modification est plus récente que celle du fichier destination. Optimise le temps de sauvegarde.
Différentiel vs Incrémentiel

Une sauvegarde différentielle compare la source à la destination actuelle. Une sauvegarde incrémentielle (non implémentée dans v1.0) comparerait à la dernière sauvegarde effectuée. La différentielle est plus simple à implémenter et permet une restauration plus rapide.

Configuration

Fichiers de configuration et persistance des données

Emplacement des fichiers

Tous les fichiers de configuration sont stockés dans un dossier Data/ situé à côté de l'exécutable :

Structure du dossier Data/
EasySave.exe
Data/
├── jobs.json        # Liste des travaux de sauvegarde
├── settings.json    # Paramètres de l'application
├── state.json       # État temps réel des sauvegardes
└── Logs/
    └── 2026-02-03.json   # Logs journaliers (un fichier par jour)

Fichier jobs.json

Contient la liste des travaux de sauvegarde configurés. Ce fichier est créé automatiquement au premier lancement.

Exemple de jobs.json
[
  {
    "id": 1,
    "name": "Sauvegarde Documents",
    "sourceDirectory": "C:\\Users\\Documents",
    "targetDirectory": "D:\\Backup\\Documents",
    "type": 0
  },
  {
    "id": 2,
    "name": "Sauvegarde Photos",
    "sourceDirectory": "C:\\Users\\Pictures",
    "targetDirectory": "D:\\Backup\\Pictures",
    "type": 1
  }
]
Types de sauvegarde

Dans le fichier JSON, le type est représenté par un entier :

  • 0 = Sauvegarde complète (Complete)
  • 1 = Sauvegarde différentielle (Differential)

Fichier settings.json

Contient les paramètres globaux de l'application, notamment la langue sélectionnée.

Exemple de settings.json
{
  "language": "fr-FR"
}
Propriété Valeurs possibles Description
language fr-FR, en-US Langue de l'interface utilisateur

EasyLog.dll

Librairie de logging réutilisable

Pourquoi une DLL séparée ?

Le cahier des charges impose une librairie de logging distincte. EasyLog est donc compilé en DLL séparée : réutilisable dans d'autres projets, compatible avec les évolutions d'EasySave, et isolée du reste du code.

Structure du Projet

Organisation Git
EasySave/
├── EasySave/           # Application principale
│   └── EasySave.csproj # Référence EasyLog
│
├── EasyLog/            # Projet DLL
│   ├── EasyLog.csproj  # Compile en DLL
│   └── Logger.cs       # Classe principale
│
└── EasySave.sln        # Solution regroupant les 2 projets

API de la Classe Logger

Logger
Méthode Description
Logger(string storageDirectory) Constructeur - initialise le répertoire de stockage des logs
Log(name, source, dest, size, transferTime) Enregistre un transfert de fichier réussi
LogError(name, source, dest, size, errorCode) Enregistre une erreur (temps négatif)
LogDirectoryCreated(name, directoryPath) Enregistre la création d'un répertoire
LogJobAction(action, jobName) Enregistre une action sur un travail (CREATED, MODIFIED, DELETED)

Structure d'une Entrée de Log

LogEntry
Propriété Type Description
Name string Nom du travail de sauvegarde
Timestamp DateTime Horodatage de l'action
SourcePath string Chemin source au format UNC
DestinationPath string Chemin destination au format UNC
FileSize long Taille du fichier en octets
TransferTimeMs long Temps de transfert (négatif si erreur)

Conversion UNC

Tous les chemins sont automatiquement convertis au format UNC (Universal Naming Convention) pour compatibilité avec les serveurs et lecteurs réseaux :

Exemple de conversion
Chemin local    : C:\Users\Documents\file.txt
Chemin UNC      : \\?\C:\Users\Documents\file.txt

Chemin réseau   : \\server\share\file.txt
Chemin UNC      : \\server\share\file.txt (inchangé)

Fichier Log Journalier

Les logs sont enregistrés dans des fichiers journaliers au format YYYY-MM-DD.json :

Exemple : 2026-02-05.json
[
  {
    "Name": "Sauvegarde Documents",
    "Timestamp": "2026-02-05T14:30:45",
    "SourcePath": "\\\\?\\C:\\Users\\Documents\\rapport.docx",
    "DestinationPath": "\\\\?\\D:\\Backup\\Documents\\rapport.docx",
    "FileSize": 245760,
    "TransferTimeMs": 45
  },
  {
    "Name": "Sauvegarde Documents",
    "Timestamp": "2026-02-05T14:30:46",
    "SourcePath": "\\\\?\\C:\\Users\\Documents\\image.png",
    "DestinationPath": "\\\\?\\D:\\Backup\\Documents\\image.png",
    "FileSize": 1048576,
    "TransferTimeMs": 120
  },
  {
    "Name": "[CREATED] Sauvegarde Photos",
    "Timestamp": "2026-02-05T15:00:00",
    "SourcePath": "",
    "DestinationPath": "",
    "FileSize": 0,
    "TransferTimeMs": 0
  }
]
Convention des Codes d'Erreur

Lorsqu'une erreur survient, TransferTimeMs contient une valeur négative :

  • -1 : Limite de travaux atteinte
  • -2 : Chemins invalides
  • -3 : Répertoire source inexistant
  • -4 : Nom de travail en doublon

Logs & États

Fichiers de suivi et traçabilité

Fichiers de log journaliers

Chaque transfert de fichier est enregistré dans un fichier JSON par jour (YYYY-MM-DD.json), dans le dossier Data/Logs/.

Exemple d'entrée de log
{
  "timestamp": "2026-02-03T15:30:45",
  "jobName": "Sauvegarde Documents",
  "sourceFile": "C:\\Users\\Documents\\rapport.docx",
  "targetFile": "D:\\Backup\\Documents\\rapport.docx",
  "fileSize": 245760,
  "transferTimeMs": 45
}
Emplacement des logs

Les logs sont stockés dans le sous-dossier Logs/ du répertoire de configuration de l'application.

Fichier d'État (state.json)

L'état temps réel des sauvegardes est maintenu dans un fichier JSON actualisé en continu.

Exemple d'état en cours d'exécution
{
  "jobName": "Sauvegarde Documents",
  "timestamp": "2026-02-03T15:30:50",
  "state": "Active",
  "totalFiles": 150,
  "totalSize": 52428800,
  "filesRemaining": 75,
  "sizeRemaining": 26214400,
  "currentSourceFile": "C:\\Users\\Documents\\images\\photo.jpg",
  "currentTargetFile": "D:\\Backup\\Documents\\images\\photo.jpg",
  "progression": 50.0
}

États possibles

Active

Sauvegarde en cours d'exécution

Inactive

Aucune sauvegarde en cours

Finished

Sauvegarde terminée avec succès

Error

Une erreur s'est produite

Bibliothèque EasyLog

Le module EasyLog est une DLL séparée qui gère l'écriture des logs. Elle offre les fonctionnalités suivantes :

Logs journaliers

Un fichier par jour au format YYYY-MM-DD.json

Format UNC

Les chemins sont convertis au format UNC pour compatibilité réseau

Gestion des erreurs

Temps de transfert négatif en cas d'erreur

Thread-safe

Écriture sécurisée pour accès concurrent

Convention des erreurs

Lorsqu'une erreur survient lors du transfert, le champ transferTimeMs contient une valeur négative représentant le code d'erreur.

Support Multilingue

Gestion des langues et traductions

Langues supportées

EasySave supporte actuellement deux langues :

Code Langue Fichier de ressources
fr-FR Français (par défaut) Resources/lang_fr.json
en-US Anglais Resources/lang_en.json

Changement de langue

La langue peut être modifiée via l'option 6 du menu principal. Le changement est immédiat et la préférence est sauvegardée dans settings.json.

Fichiers de traduction

Les traductions sont stockées dans des fichiers JSON situés dans le dossier Resources/ :

Extrait de lang_fr.json
{
  "MenuOption1": "1. Lister les travaux",
  "MenuOption2": "2. Créer un travail",
  "MenuOption3": "3. Modifier un travail",
  "JobCreated": "Travail créé avec succès !",
  "JobDeleted": "Travail supprimé avec succès !",
  "MaxJobsReached": "Erreur : Limite de 5 travaux atteinte."
}

Architecture du LanguageManager

Le gestionnaire de langues utilise le pattern Singleton pour garantir une instance unique dans toute l'application.

LanguageManager
Méthode Description
Instance Propriété statique retournant l'instance unique
LoadLanguage(string) Charge un fichier de langue (fr-FR ou en-US)
GetString(string) Retourne la traduction pour une clé donnée
CurrentLanguage Retourne le code de la langue actuelle
Traductions par défaut

Si les fichiers de traduction sont manquants ou corrompus, le LanguageManager utilise des traductions intégrées dans le code source.

Conformité au Cahier des Charges

Synthèse du respect de toutes les exigences du CDC v1.0

Synthèse

Les tableaux ci-dessous rattachent chaque exigence du CDC à son implémentation dans le projet.

Exigences Fonctionnelles

Exigence CDC Statut Implémentation
Application Console .NET Projet console .NET 10.0 (EasySave.csproj)
Maximum 5 travaux de sauvegarde Constante MaxJobs = 5 dans JobManager.cs
Définition travail (nom, source, cible, type) Classe BackupJob avec propriétés Id, Name, SourceDirectory, TargetDirectory, Type
Sauvegarde complète Enum BackupType.Complete - copie tous les fichiers
Sauvegarde différentielle Enum BackupType.Differential - copie uniquement les fichiers modifiés (date)
Support multilingue (FR/EN) LanguageManager (Singleton) + fichiers lang_fr.json, lang_en.json
Exécution séquentielle de tous les travaux Méthode ExecuteAllJobs() dans BackupExecutor
Exécution via ligne de commande RunCommandLineMode() dans AppController
Format CLI : EasySave.exe 1-3 (plage) InputParser.ParseJobIds() supporte format N-M
Format CLI : EasySave.exe 1;3 (liste) InputParser.ParseJobIds() supporte format N;M;O

Exigences Techniques - Stockage

Exigence CDC Statut Implémentation
Support disques locaux Chemins standards (C:\, D:\...)
Support disques externes Tout chemin valide accessible par le système
Support lecteurs réseaux (UNC) Méthode ConvertToUncPath() dans Logger.cs
Sauvegarde fichiers + sous-répertoires Récursion dans ProcessDirectory() de BackupExecutor

Exigences Techniques - Logging & État

Exigence CDC Statut Implémentation
Fichier log journalier Format YYYY-MM-DD.json via GetDailyLogFileName()
Contenu log : horodatage, nom, source, dest, taille, temps Classe LogEntry avec tous les champs requis
Temps de transfert négatif si erreur Méthode LogError() avec code négatif
DLL séparée nommée EasyLog.dll Projet distinct EasyLog/ compilé en DLL
Fichier état temps réel unique state.json géré par StateManager
État : nom travail, horodatage, statut Classe JobState avec JobName, Timestamp, State
État actif : total fichiers, taille, progression TotalFiles, TotalSize, Progression, FilesRemaining
État actif : fichiers source/dest en cours CurrentSourceFile, CurrentTargetFile
Emplacement flexible (pas c:\temp) Dossier Data/ relatif à l'exécutable
Format JSON avec retours à la ligne WriteIndented = true dans JsonSerializerOptions
Préparation version 2.0

L'architecture MVC actuelle a été conçue pour faciliter la migration vers une interface graphique MVVM dans la future version 2.0. La séparation claire entre la logique métier (Services) et l'affichage (Views) permettra de remplacer ConsoleView par une interface WPF/MAUI sans modifier les services.

Notes de Version

Historique des versions d'EasySave

v1.0 04 Février 2026

Fonctionnalités principales

  • Application Console (.NET)
  • Gestion de 5 travaux de sauvegarde maximum
  • Sauvegardes complètes et différentielles
  • Support multilingue (Français / Anglais)
  • Exécution séquentielle ou spécifique (CLI)

Technique

  • Architecture MVC
  • Logs journaliers au format JSON (via EasyLog.dll)
  • État d'avancement temps réel (JSON)
  • Support des chemins UNC et lecteurs réseaux