Introduction
Documentation technique EasySave v3.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 / Avalonia UI
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, 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 un nombre illimité de 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 (v3.0)
Exécution Parallèle
Nouveau v3.0 — Les travaux de sauvegarde s'exécutent simultanément via
Task.WhenAll, exploitant pleinement les processeurs multi-cœurs.
Pause / Reprise / Stop
Nouveau v3.0 — Contrôles en temps réel par travail : pause, reprise et arrêt
via JobController (ManualResetEventSlim +
CancellationToken).
Fichiers Prioritaires
Nouveau v3.0 — Les fichiers dont l'extension est marquée prioritaire sont transférés en premier par tous les travaux (barrière globale).
Fichiers Volumineux
Nouveau v3.0 — Un seul fichier dépassant la taille maximale configurée (Ko)
est transféré à la fois (SemaphoreSlim).
CryptoSoft Mono-Instance
Nouveau v3.0 — Un Mutex nommé garantit qu'une seule instance de
CryptoSoft s'exécute à la fois, même en parallèle.
Auto-Pause Logiciel Métier
Nouveau v3.0 — Si le logiciel métier est détecté, tous les travaux sont automatiquement mis en pause ; reprise automatique à la fermeture.
Interface Graphique
Interface moderne Avalonia UI (XAML) avec panneau de progression en temps réel par travail et boutons Pause/Reprise/Stop.
Logs Détaillés
Traçabilité complète : horodatage, temps de transfert, temps de chiffrement. Mode de log configurable (local, serveur, les deux).
Modes d'Utilisation
- Interface Graphique (GUI) : Gestion complète et intuitive via une fenêtre moderne.
- Mode ligne de commande : Pour l'automatisation (syntaxe identique aux v1.0 et v1.1).
Roadmap des Versions
Version Console
Application console, 5 travaux max, logs JSON, multilingue.
Console améliorée
Choix du format de log (JSON/XML), interface console améliorée.
Interface Graphique
GUI Avalonia, travaux illimités, CryptoSoft, logiciel métier, logs avec temps de cryptage.
Version Avancée (Actuelle)
Exécution parallèle, Pause/Reprise/Stop par travail, fichiers prioritaires, fichiers volumineux, CryptoSoft mono-instance, auto-pause logiciel métier.
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 MVVM (Model-View-ViewModel), pour garder une architecture claire et évolutive.
Étapes de Conception
Analyse du Cahier des Charges
Identification des exigences fonctionnelles (travaux illimités en v2.0/v3.0, 2 types de sauvegarde, multilingue, interface graphique) et des exigences techniques (logs JSON/XML, état temps réel, DLL EasyLog, CryptoSoft, logiciel métier).
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 les paramètres.
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.
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.
Diagrammes de Séquence
Pour chaque cas d'utilisation, création d'un diagramme de séquence détaillant les interactions entre les objets : View → ViewModel → Service → Model. Ces diagrammes ont guidé l'implémentation des méthodes.
Implémentation MVVM
Développement du code C# en respectant le pattern MVVM (v2.0/v3.0) avec
réutilisation de la logique métier :
• Models : BackupJob, JobState, ProgressInfo
• ViewModels : MainViewModel, JobEditViewModel, SettingsViewModel
• Views : Interface Avalonia (MainWindow, JobEditWindow,
SettingsWindow), LanguageManager
• Services : BackupService (Façade), JobManager, BackupExecutor,
StateManager, intégration CryptoSoft
Stratégie Git
Le projet utilise GitFlow pour la gestion des branches :
main: Version stable de productiondevelop: Branche d'intégration des fonctionnalitésfeature/*: Développement de nouvelles fonctionnalitésdocs/*: 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.
MVVM
Séparation entre données (Models), affichage (Views) et logique de présentation (ViewModels) avec data binding bidirectionnel.
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.0Compilation
Pour générer un exécutable autonome (self-contained), utilisez la commande correspondant à votre plateforme :
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r win-x64 --self-contained true -o ./publish/windows
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r osx-arm64 --self-contained true -o ./publish/macos
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r osx-x64 --self-contained true -o ./publish/macos_intel
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r linux-x64 --self-contained true -o ./publish/linux
Lancement rapide (développement)
dotnet run --project EasySave.Avalonia
Guide Utilisateur
Utilisation de l'interface graphique EasySave v3.0
Fenêtre Principale
Au lancement sans arguments, EasySave ouvre une interface graphique (Avalonia UI) composée d'une fenêtre principale affichant la liste des travaux de sauvegarde.
- Liste des travaux : tableau avec ID, nom, source, destination, type (Complète / Différentielle)
- Créer un travail : bouton ouvrant une fenêtre de création (nom, source, destination, type)
- Modifier un travail : sélection d'un travail puis édition des champs
- Supprimer un travail : suppression après confirmation
- Exécuter un ou plusieurs travaux : lancement avec progression en temps réel
- Paramètres : langue (FR/EN), format de log (JSON/XML), extensions à chiffrer, logiciel métier
Créer un Travail
Nom du travail
Nom descriptif unique (ex: "Sauvegarde Documents"). Le nom ne doit pas déjà exister.
Répertoire source
Chemin du dossier à sauvegarder. Supports : disques locaux, externes, chemins réseau (UNC).
Répertoire destination
Chemin de destination. Le dossier est créé automatiquement s'il n'existe pas.
Type de sauvegarde
Complète : copie tous les fichiers. Différentielle : uniquement les fichiers modifiés depuis la destination.
En version 3.0, le nombre de travaux de sauvegarde est illimité.
Exécuter des Travaux
Vous pouvez lancer un travail unique, une sélection, ou tous les travaux. En v3.0, les travaux
s'exécutent en parallèle. La progression s'affiche en temps réel
par travail avec des contrôles Pause / Reprise / Stop
individuels. En ligne de commande, la syntaxe reste identique aux v1.0 et v1.1
(EasySave.Avalonia.exe 1-3,
1;3;5).
Si un logiciel métier est détecté (configuré dans Paramètres), tous les travaux en cours sont automatiquement mis en pause. À la fermeture du logiciel métier, les travaux reprennent automatiquement. L'événement est consigné dans le fichier log.
Paramètres (Paramètres généraux)
| Paramètre | Description |
|---|---|
| Langue | Français (fr-FR) ou Anglais (en-US) |
| Format des logs | JSON ou XML pour les fichiers journaliers dans Data/Logs/ |
| Extensions à chiffrer | Liste d'extensions (ex: .docx, .pdf). Seuls ces fichiers sont cryptés via CryptoSoft avant copie. |
| Logiciel métier | Nom du processus du logiciel métier (ex: calculatrice). S'il est détecté, auto-pause de tous les travaux ; reprise automatique à la fermeture. |
| Extensions prioritaires (v3.0) | Extensions transférées en premier par tous les travaux (barrière globale). |
| Taille max fichier volumineux (v3.0) | Seuil en Ko au-dessus duquel un seul fichier est transféré à la fois. |
| Mode de log (v3.0) | Local, Centralized (serveur Docker), ou Both. |
| URL serveur de log (v3.0) | URL du service LogCentralization (ex: http://localhost:5050). |
Notes Importantes
Sauvegarde automatique
Les travaux et paramètres sont sauvegardés automatiquement
Validation des chemins
Les chemins source et destination sont validés à la création
Logs et chiffrement
Chaque transfert est loggé ; le temps de cryptage (si applicable) est enregistré
Différentiel
Les sauvegardes différentielles sans fichiers modifiés sont ignorées
Ligne de Commande
Exécution directe via arguments
Syntaxe
EasySave.Avalonia.exe <sélecteur_travaux>
Formats de sélection
| Format | Description | Exemple |
|---|---|---|
N |
Exécute un seul travail par son ID | EasySave.Avalonia.exe 1 |
N-M |
Exécute une plage de travaux (de N à M) | EasySave.Avalonia.exe 1-3 |
N;M;O |
Exécute une liste de travaux spécifiques | EasySave.Avalonia.exe 1;3;5 |
Exemples d'utilisation
./EasySave.Avalonia.exe 2
./EasySave.Avalonia.exe 1-3
./EasySave.Avalonia.exe 1;3;5
Manuel utilisateur (1 page)
Résumé condensé EasySave v3.0
EasySave v3.0 est une application de sauvegarde avec interface graphique (GUI). Elle permet de créer un nombre illimité de travaux de sauvegarde, de les exécuter en parallèle avec contrôles Pause/Reprise/Stop par travail, de chiffrer des fichiers sensibles et de centraliser les logs via Docker.
Comparaison des versions
| Fonction | Version 1.0 | Version 1.1 | Version 2.0 | Version 3.0 |
|---|---|---|---|---|
| Interface | Console | Console | Graphique | Graphique |
| Multi-langues | Anglais et Français | Anglais et Français | Anglais et Français | Anglais et Français |
| Travaux de sauvegarde | Limité à 5 | Limité à 5 | Illimité | Illimité |
| Fichier Log journalier | Oui en JSON uniquement | Oui (JSON, XML) | Oui (JSON, XML) + temps de cryptage | Oui (JSON, XML) |
| L'utilisateur peut mettre en pause une ou plusieurs tâches | Non | Non | Non | Oui |
| Fichier État | Oui | Oui | Oui | Oui |
| Type de fonctionnement Sauvegarde | Mono ou séquentielle | Mono ou séquentielle | Mono ou Séquentielle | Parallèle |
| Arrêt si détection du logiciel métier | Non | Non | Oui (impossible de lancer un travail) | Oui (arrêt de tous les transferts en cours) |
| Utilisation du logiciel de cryptage externe « CryptoSoft » | Non | Non | Oui | Oui (logiciel Mono-Instance) |
| Gestion de fichiers Prioritaires | Non | Non | Non | OUI, avec attente des autres tâches |
| Interdiction de sauvegardes simultanées pour les fichiers volumineux | Non | Non | Non | OUI |
| Centralisation des fichiers log Journalier | Non | Non | Non | Oui |
| Ligne de commande | Oui | identique version 1.0 | identique version 1.0 | identique version 1.0 |
Interface principale
Au démarrage, le tableau de bord affiche tous les travaux de sauvegarde. Créer (Ajouter), Exécuter (sélectionner puis Lancer), Supprimer, Paramètres (langue, chiffrement, logs).
Paramètres
- Général : Langue (FR/EN), Format des logs (JSON ou XML).
- Logiciel métier : Nom du processus (ex. Calculatrice). S'il est en cours, EasySave bloque les nouvelles sauvegardes et arrête les en cours.
- Chiffrement (CryptoSoft) : Extensions à chiffrer (ex. .pdf, .docx). Seuls les fichiers avec ces extensions sont chiffrés. Le module CryptoSoft est intégré directement dans l'application.
Créer un travail
Cliquer sur Ajouter un travail, renseigner le nom, la source, la destination, le type (Complète ou Différentielle), puis Enregistrer. Aucune limite de nombre de travaux.
Exécuter des sauvegardes
Sélectionner un ou plusieurs travaux, cliquer sur Lancer. La fenêtre de progression affiche l'état. Si un logiciel métier est détecté, la sauvegarde s'arrête automatiquement.
Logs
Stockés dans Data/Logs/ : format YYYY-MM-DD.json ou
YYYY-MM-DD.xml. Contenu : horodatage, source, destination, taille, temps de transfert,
temps de chiffrement.
Conception (UML)
Diagrammes de modélisation du système
Cas d'Utilisation
Diagramme de Classes
Diagramme d'Activité
Diagrammes de Séquence
Créer un travail
Modifier un travail
Supprimer un travail
Exécuter un travail
Lister les travaux
Changer les paramètres
Chiffrer un fichier (CryptoSoft)
Play / Stop / Pause un travail
Détecter le logiciel métier
Gérer la persistance
Architecture
Structure du projet et pattern MVVM (v3.0)
Qu'est-ce que le Pattern MVVM ?
EasySave s'appuie sur le pattern Model-View-ViewModel (MVVM), adapté aux interfaces graphiques. En v3.0, la couche Services intègre l'exécution parallèle asynchrone, les contrôles Pause/Reprise/Stop par travail, et la gestion des fichiers prioritaires.
Model (Modèle)
Représente les données. Indépendant de l'interface.
Dans EasySave : BackupJob, JobState,
BackupType, JobStatus (v3.0), JobController
(v3.0), AppSettings
View (Vue)
Interface graphique Avalonia (XAML) : fenêtres et contrôles. Pas de logique métier.
Dans EasySave : MainWindow (liste + progression par travail),
JobEditWindow,
SettingsWindow (v3.0 : prioritaires, taille max, log mode)
ViewModel
Expose les données et commandes à la Vue. Fait le lien avec les Services.
Dans EasySave : MainViewModel, JobEditViewModel,
SettingsViewModel, JobProgressViewModel (v3.0)
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 et ViewModels peuvent être testés indépendamment de l'interface. On peut mocker les services dans les tests unitaires. |
| Évolutivité | La migration de la console (v1.x) vers l'interface Avalonia (v2.0) a conservé Models et Services ; seules les Vues et le flux de contrôle ont changé (MVVM). |
| Réutilisabilité | Les models BackupJob et JobState et les services sont
réutilisables (CLI possible en parallèle de la GUI). |
| Maintenabilité | Un bug d'affichage ? → Modifier les vues Avalonia ou ViewModels. Un bug dans la
sauvegarde ? → Modifier BackupExecutor ou services. |
Flux de Données dans EasySave (v3.0)
Lors d'une action utilisateur dans l'interface graphique :
L'utilisateur interagit avec la View
La fenêtre Avalonia (ex: MainWindow) déclenche une Commande
(ex: Exécuter un travail).
Le ViewModel exécute l'action
MainViewModel (ou JobEditViewModel) appelle le
BackupService pour créer, modifier, supprimer ou exécuter des travaux.
Les Services exécutent la logique métier
BackupService délègue à BackupExecutor (copie, chiffrement
CryptoSoft si extension concernée), StateManager, Logger.
Models et fichiers mis à jour
state.json, logs journaliers (JSON/XML), jobs.json et
settings.json sont persistés.
La View est notifiée (binding)
Les propriétés du ViewModel (progression, état) sont liées à la Vue ; l'interface se met à jour automatiquement (Observer / INotifyPropertyChanged).
Diagramme MVVM Simplifié
EasySave v3.0 : couche Services avec exécution parallèle, contrôles temps réel, ViewModels pour la GUI.
Views (Avalonia)
MainWindow, JobEditWindow, SettingsWindow
Interface graphique XAML — Panneau de progression v3.0ViewModels
MainViewModel, JobEditViewModel, SettingsViewModel, JobProgressViewModel
Commandes, données, contrôles Pause/Reprise/StopModels
BackupJob, JobState, BackupType, JobStatus, JobController, AppSettings
Données métier + contrôles v3.0Services
BackupService, BackupExecutor (parallèle), StateManager (thread-safe), CryptoSoftService (mono-instance)
Logique métier — Exécution async, SemaphoreSlim, lockLa logique métier reste dans une couche Services indépendante de l'UI, ce qui permet la réutilisation (CLI en ligne de commande, tests unitaires) et le respect du principe de responsabilité unique (SRP).
Structure des fichiers (v3.0)
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.
| Propriété | Type | Description |
|---|---|---|
Id |
int | Identifiant unique (v2.0 : nombre de travaux illimité) |
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).
| 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) |
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.
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 :
EasySave.Avalonia.exe
Data/
├── jobs.json # Liste des travaux de sauvegarde
├── settings.json # Paramètres (langue, format log, extensions chiffrement, logiciel métier)
├── state.json # État temps réel des sauvegardes
└── Logs/
├── 2026-02-03.json # Logs journaliers (JSON ou XML selon paramètre)
└── 2026-02-03.xml
Fichier jobs.json
Contient la liste des travaux de sauvegarde configurés. Ce fichier est créé automatiquement au premier lancement.
[
{
"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
}
]
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 : langue, format des logs, extensions à chiffrer (CryptoSoft), logiciel métier, extensions prioritaires, taille max fichier volumineux, mode de log et URL du serveur de log (v3.0).
{
"language": "fr-FR",
"logFormat": "JSON",
"businessSoftwareProcessName": "Calculator",
"encryptedExtensions": [ ".docx", ".pdf", ".xlsx" ],
"priorityExtensions": [ ".docx", ".pdf" ],
"maxLargeFileTransferSizeKB": 10240,
"logMode": "Local",
"logServerUrl": "http://localhost:5000"
}
| Propriété | Valeurs possibles | Description |
|---|---|---|
language |
fr-FR, en-US |
Langue de l'interface utilisateur |
logFormat |
JSON, XML |
Format des fichiers de log journaliers |
businessSoftwareProcessName |
Nom de processus (ex. Calculator) |
Logiciel métier : v3.0 — auto-pause/reprise de tous les travaux si détecté |
encryptedExtensions |
Liste d'extensions (ex. [".pdf", ".docx"]) |
Fichiers à chiffrer via CryptoSoft avant copie |
priorityExtensions |
Liste d'extensions (ex. [".docx"]) |
v3.0 — Extensions prioritaires transférées en premier (barrière globale) |
maxLargeFileTransferSizeKB |
Entier (Ko), ex. 10240 = 10 Mo |
v3.0 — Fichiers au-dessus de cette taille sont transférés un à la fois |
logMode |
Local, Server, Both |
v3.0 — Mode de logs : fichier local, serveur distant, ou les deux |
logServerUrl |
URL (ex. http://localhost:5000) |
v3.0 — URL du serveur de logs centralisé (utilisé si logMode = Server ou Both) |
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
EasySave/
├── EasySave/ # Bibliothèque métier (Models, Services, ViewModels)
│ └── EasySave.csproj # Référence EasyLog + CryptoSoft
│
├── EasySave.Avalonia/ # Interface graphique (Views Avalonia)
│ └── EasySave.Avalonia.csproj # Point d'entrée (WinExe), référence EasySave
│
├── EasyLog/ # Projet DLL de logging
│ ├── EasyLog.csproj # Compile en DLL
│ └── Logger.cs # Classe principale
│
├── CryptoSoft/ # Module de chiffrement (DLL)
│ └── CryptoSoft.csproj
│
├── EasySave.Tests/ # Tests unitaires et d'intégration (xUnit)
│ └── EasySave.Tests.csproj
│
└── EasySave.sln # Solution regroupant les 5 projets
API de la Classe 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
| 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 en ms (négatif si erreur) |
EncryptionTimeMs |
long | v2.0 : Temps de cryptage en ms (0 = pas de cryptage, >0 = temps, <0 = code erreur) |
Formats de log (JSON / XML)
Depuis la v1.1, l'utilisateur peut choisir le format des fichiers log journaliers :
YYYY-MM-DD.json ou YYYY-MM-DD.xml. Le paramètre est stocké dans
settings.json (logFormat).
Conversion UNC
Tous les chemins sont automatiquement convertis au format UNC (Universal Naming Convention) pour compatibilité avec les serveurs et lecteurs réseaux :
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 :
[
{
"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
}
]
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 est enregistré dans un fichier par jour (YYYY-MM-DD.json ou
YYYY-MM-DD.xml selon les paramètres), dans Data/Logs/. En v3.0, chaque
entrée peut inclure le temps de cryptage (EncryptionTimeMs) : 0 = pas de cryptage,
>0 = temps en ms, <0 = code erreur.
{
"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
}
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.
{
"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 : YYYY-MM-DD.json ou YYYY-MM-DD.xml
Temps de cryptage (v2.0)
Champ EncryptionTimeMs : 0 = pas de cryptage, >0 = temps en ms, <0 =
erreur
Format UNC
Les chemins sont convertis au format UNC pour compatibilité réseau
Thread-safe
Écriture sécurisée pour accès concurrent
TransferTimeMs ou EncryptionTimeMs négatif = code d'erreur. L'arrêt dû
au
logiciel métier est consigné dans le log.
CryptoSoft (v3.0 — Mono-Instance)
Chiffrement des fichiers avant sauvegarde
Rôle de CryptoSoft
Le cahier des charges impose l'utilisation du logiciel de cryptage CryptoSoft. Seuls les fichiers dont l'extension figure dans la liste définie par l'utilisateur (paramètres généraux) sont cryptés avant d'être copiés vers la destination.
Nouveau v3.0 : CryptoSoft est désormais mono-instance.
Un Mutex nommé (Global\CryptoSoftMutex) empêche le lancement
simultané de plusieurs processus CryptoSoft. Côté EasySave, un
SemaphoreSlim(1,1) dans CryptoSoftService sérialise les appels
internes au module de chiffrement.
Fonctionnement
- L'utilisateur configure dans Paramètres la liste des extensions à chiffrer (ex: .docx, .pdf, .xlsx).
- Lors d'une sauvegarde, pour chaque fichier dont l'extension est dans cette liste, EasySave appelle CryptoSoft pour chiffrer le fichier (XOR ou algorithme implémenté) avant la copie.
- Le temps de cryptage (en ms) est enregistré dans le fichier log journalier
(
EncryptionTimeMs). Valeur 0 = pas de cryptage, >0 = temps, <0 = code erreur.
Paramètres
La liste des extensions est stockée dans settings.json sous la clé
encryptedExtensions (tableau de chaînes). Elle est modifiable via la fenêtre
Paramètres de l'interface.
Docker — LogCentralization (v3.0)
Service de centralisation des logs EasySave en temps réel
Pourquoi centraliser les logs ?
En v3.0, EasySave peut envoyer ses logs vers un serveur centralisé déployé sous Docker. Cela permet de regrouper les logs de toutes les machines et utilisateurs dans un fichier journalier unique par jour, facilitant l'audit et le suivi des sauvegardes à l'échelle de l'entreprise.
Architecture
API ASP.NET Core
Service web léger exposant un endpoint POST /api/logs pour recevoir
les entrées de log au format JSON.
Fichier journalier centralisé
Un fichier par jour (YYYY-MM-DD.json) agrège les entrées de toutes
les machines. Chaque entrée contient machineId et
userName.
Docker Compose
Déploiement en une commande : docker compose up -d. Volume persistant
pour les données de log.
Port 5050
Le service écoute sur le port 5050 (configurable dans
docker-compose.yml).
Déploiement avec Docker Compose
Depuis la racine du dépôt :
docker compose up -d
Le service écoute sur http://localhost:5050. Les logs centralisés
sont stockés dans le volume Docker logcentralization_data
(répertoire /app/Data/Logs dans le conteneur).
Build manuel de l'image
docker build -f LogCentralization/Dockerfile -t easysave-logcentralization .
docker run -d -p 5050:5050 -v logcentralization_data:/app/Data --name easysave-logcentralization easysave-logcentralization
Exécution locale (sans Docker)
cd LogCentralization
dotnet run
Configuration du client EasySave
Dans les paramètres généraux (ou dans settings.json) :
| Paramètre | Valeurs possibles | Description |
|---|---|---|
logMode |
Local, Centralized, Both |
Mode de logs : fichier local seul, serveur centralisé seul, ou les deux |
logServerUrl |
URL (ex. http://localhost:5050) |
URL du serveur LogCentralization (utilisé si logMode = Centralized ou Both) |
Endpoint API
{
"machineId": "PC-BUREAU-01",
"userName": "jean.dupont",
"name": "Sauvegarde Documents",
"timestamp": "2026-02-24T14:30:45",
"sourcePath": "C:\\Users\\Documents\\rapport.docx",
"destinationPath": "D:\\Backup\\Documents\\rapport.docx",
"fileSize": 245760,
"transferTimeMs": 45,
"encryptionTimeMs": 12
}
docker-compose.yml
services:
logcentralization:
build:
context: .
dockerfile: LogCentralization/Dockerfile
container_name: easysave-logcentralization
ports:
- "5050:5050"
volumes:
- logcentralization_data:/app/Data
environment:
- LogStorage__Directory=/app/Data/Logs
restart: unless-stopped
volumes:
logcentralization_data:
Le service est un projet ASP.NET Core séparé dans le dossier
LogCentralization/ avec son propre Dockerfile,
Controllers/, Models/ et Services/.
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
En v3.0, la langue se change via Paramètres (fenêtre Paramètres). Le choix est
sauvegardé dans settings.json et persiste entre les sessions.
Fichiers de traduction
Les traductions sont stockées dans des fichiers JSON situés dans le dossier Resources/ :
{
"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.
| 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 |
Si les fichiers de traduction sont manquants ou corrompus, le LanguageManager utilise des traductions intégrées dans le code source.
Support technique
Prérequis, installation, emplacements des fichiers, dépannage
Configuration minimale
| Exigence | Spécification |
|---|---|
| Système d'exploitation | Windows 10+, macOS 11+, Linux |
| Runtime | .NET 10.0 / 8.0 (compatible) |
| Espace disque | ~150 Mo (application + CryptoSoft) |
| RAM | 512 Mo minimum |
Installation
Exécutable autonome : Aucune installation requise. Le module CryptoSoft est intégré directement dans l'application (DLL incluse).
Compilation depuis les sources :
dotnet publish EasySave.Avalonia/EasySave.Avalonia.csproj -c Release -r <RID> --self-contained true -o ./publish
RID (Runtime Identifier) : Windows win-x64, macOS ARM
osx-arm64, Linux linux-x64.
Emplacements des fichiers
Tous les fichiers de configuration et de log sont dans le dossier Data/, à côté de
l'exécutable :
EasySave/
├── EasySave.Avalonia.exe (application principale)
├── CryptoSoft.dll (module de chiffrement, intégré)
└── Data/
├── jobs.json # Définition des travaux
├── settings.json # Paramètres (langue, format log, extensions, logiciel métier)
├── state.json # État d'exécution en temps réel
└── Logs/
└── YYYY-MM-DD.json # Logs journaliers des transferts
Formats des fichiers de configuration
settings.json (v3.0) — Champs : language, logFormat,
businessSoftwareProcessName, encryptedExtensions,
priorityExtensions, maxLargeFileTransferSizeKB,
logMode, logServerUrl.
state.json — Champs : JobId, JobName,
SourceFilePath,
TargetFilePath, State, TotalFiles, FilesToCopy,
TotalSize, BytesToCopy, Progression.
Log journalier (YYYY-MM-DD.json) — Chaque entrée : Name,
SourceFilePath, TargetFilePath, FileSize,
TransferTime, EncryptionTime, Time.
EncryptionTime
en ms (0 si non chiffré). TransferTime < 0 = erreur.
Dépannage
| Problème | Solution |
|---|---|
| « Erreur de chiffrement » | Vérifier que les extensions configurées sont correctes dans les Paramètres et que les fichiers source sont accessibles. |
| « Logiciel métier détecté » | Fermer le logiciel détecté ; v3.0 : les travaux reprennent automatiquement à la fermeture du processus. |
| Travaux en pause | Vérifier la fenêtre de progression : cliquer sur « Reprendre » ou vérifier si le logiciel métier est actif (v3.0 : auto-pause). |
| Fichiers volumineux lents | V3.0 : un seul fichier volumineux est transféré à la fois
(SemaphoreSlim). Augmenter maxLargeFileTransferSizeKB dans
les Paramètres pour changer le seuil. |
| La langue de l'interface ne change pas | Redémarrer l'application ou vérifier le dossier Resources/. |
| Les logs ne sont pas créés | S'assurer que le répertoire Data/Logs/ est accessible en écriture. |
Contact
Pour le support, contacter l'équipe technique ProSoft.
Tests
Architecture, exécution et détail des tests EasySave
Cette section décrit l'architecture du projet de tests, les technologies utilisées, comment lancer les tests et le détail de chaque suite de tests.
1. Architecture du projet de tests
Le projet de tests se trouve dans le dossier EasySave.Tests/ et suit la structure
suivante :
EasySave.Tests/
├── EasySave.Tests.csproj # Fichier projet (dépendances, références)
├── Mocks/
│ ├── TestData.cs # Données de test réutilisables (jobs, settings, fichiers temporaires)
│ └── MockDialogService.cs # Mock du service de dialogues pour les ViewModels
├── Services/
│ ├── BackupServiceTests.cs # Tests de la façade BackupService (CRUD, exécution, settings)
│ ├── BackupExecutorV3Tests.cs # v3.0 : parallélisme, priorités, fichiers volumineux, logiciel métier
│ ├── JobControllerTests.cs # v3.0 : pause/resume/stop, WaitIfPaused
│ ├── CryptoSoftEngineTests.cs # Tests du moteur de chiffrement XOR
│ └── CryptoSoftServiceTests.cs # Tests du wrapper de chiffrement avec timing
├── ViewModels/
│ ├── JobEditViewModelTests.cs # Tests du ViewModel d'édition de job
│ ├── JobProgressViewModelTests.cs # v3.0 : progression par travail, commandes
│ ├── MainViewModelTests.cs # Tests du ViewModel principal
│ ├── RelayCommandTests.cs # Tests de l'implémentation ICommand
│ └── SettingsViewModelTests.cs # Tests du ViewModel de paramètres
└── RegressionTests.cs # Tests de régression (compatibilité v1.0/v1.1 → v2.0/v3.0)
L'organisation miroir la structure du projet principal (Services/,
ViewModels/)
pour faciliter la navigation.
2. Technologies et dépendances
| Package | Version | Rôle |
|---|---|---|
xunit |
2.9.3 | Framework de tests unitaires |
xunit.runner.visualstudio |
3.1.4 | Runner pour l'intégration IDE (Visual Studio, Rider) |
Microsoft.NET.Test.Sdk |
17.14.1 | SDK de la plateforme de test .NET |
coverlet.collector |
6.0.4 | Collecteur de couverture de code |
Framework cible : .NET 10.0
Références de projet : EasySave.csproj (projet principal),
CryptoSoft.csproj (module de chiffrement).
3. Types de tests utilisés
3.1 Tests unitaires (Unit Tests)
La majorité des tests sont des tests unitaires. Ils testent des unités de code isolées, sans dépendances externes réelles.
Fichiers concernés : RelayCommandTests.cs,
JobEditViewModelTests.cs,
SettingsViewModelTests.cs, CryptoSoftEngineTests.cs,
CryptoSoftServiceTests.cs.
- Utilisation de mocks (
MockDialogService) pour isoler les ViewModels de l'UI - Données de test centralisées (
TestData) - Chaque test vérifie un seul comportement (Arrange-Act-Assert)
3.2 Tests d'intégration (Integration Tests)
Ils vérifient l'interaction entre plusieurs composants réels.
Fichiers concernés : BackupServiceTests.cs,
MainViewModelTests.cs.
- Création de vrais fichiers et dossiers temporaires ; nettoyage via
IDisposable - Collection xUnit
[Collection("BackupService")]pour éviter les conflits de parallélisme
3.3 Tests de régression (Regression Tests)
Ils garantissent que les fonctionnalités v1.0/v1.1 continuent de fonctionner dans la v2.0/v3.0.
Fichier : RegressionTests.cs. Catégories : sauvegarde complète et
différentielle, StateManager, journalisation JSON/XML, CRUD jobs, parsing arguments CLI.
4. Comment lancer les tests
| Commande | Description |
|---|---|
dotnet test |
Lancer tous les tests |
dotnet test EasySave.Tests/ |
Lancer uniquement le projet de tests |
dotnet test --filter "FullyQualifiedName~BackupServiceTests" |
Lancer un fichier de tests spécifique |
dotnet test --filter "FullyQualifiedName~BackupServiceTests.CreateJob_Valid_ReturnsTrue"
|
Lancer un test unique |
dotnet test --collect:"XPlat Code Coverage" |
Lancer les tests avec couverture de code (rapport dans TestResults/)
|
5. Verbosité des tests
Option --verbosity (ou -v) : quiet, minimal,
normal (défaut), detailed, diagnostic.
Génération d'un rapport TRX (CI) :
dotnet test --logger "trx;LogFileName=results.trx"
6. CI/CD
Les tests sont exécutés automatiquement via GitHub Actions à chaque push ou pull
request sur les branches v1.0, v1.1, v2.0, v3.0,
develop et main.
Points clés : build et tests multi-plateforme (Windows, Ubuntu, macOS) ; sur les branches version (v*), publish self-contained et création/mise à jour d’une Release GitHub avec les archives par OS.
7. Infrastructure de test — Mocks
TestData : données réutilisables (jobs valides/invalides, paramètres, structures de fichiers temporaires, nettoyage).
MockDialogService : implémentation mock de IDialogService pour tester
les ViewModels sans UI (résultats prédéfinis pour dialogues et confirmations, compteurs d'appels,
Reset()).
8. Détail de chaque suite de tests
RegressionTests — Tests de régression
But : Vérifier que les fonctionnalités v1.0/v1.1 fonctionnent toujours en v2.0/v3.0.
Catégories : Backup (complète, différentielle), StateManager, Logger (JSON, XML, EncryptionTimeMs), Job CRUD, parsing CLI (plage, liste, entrée unique, entrée invalide, HasJobArguments).
BackupServiceTests — Façade BackupService
But : Tester l'API publique (CRUD jobs, exécution, paramètres).
Catégories : création (valide, chemins invalides, doublon, pas de limite en v2.0), récupération (liste vide, index valide/invalide), JobNameExists, suppression, modification, exécution (valide, copie réelle, ExecuteAllJobs, source vide), paramètres (GetSettings, UpdateSettings, ChangeLanguage), événement Progress.
CryptoSoftEngineTests — Moteur de chiffrement XOR
But : Tester le chiffrement/déchiffrement symétrique.
Tests : contenu changé après chiffrement, double chiffrement restaure l'original, FileNotFoundException si source absente, fichier vide, création du répertoire de destination, fichier volumineux (1 Mo), contenu binaire (taille préservée).
CryptoSoftServiceTests — Wrapper avec timing
But : Tester RunWithTiming() (chiffrement + mesure du temps).
Tests : succès (true, temps ≥ 0), source introuvable (false, temps -1), fichier chiffré valide.
JobEditViewModelTests — ViewModel d'édition
But : Validation, constructeurs, conversion ToBackupJob().
Catégories : constructeur (nouveau job champs vides, job existant pré-rempli), IsValid (champs remplis, nom vide/espaces, source/dest vides, caractères spéciaux, nom long), ToBackupJob (valeurs, préservation ID, ID 0 pour nouveau), PropertyChanged (Name, IsValid, SourceDirectory), AvailableTypes (Complete et Differential).
MainViewModelTests — ViewModel principal
But : Commandes, état, interactions avec MockDialogService.
Catégories : état initial (JobsList, SelectedJob, IsExecuting, ProgressValue), CanExecute des commandes, sélection (HasSelection, PropertyChanged), CreateJob (annulation, ajout), DeleteJob (confirmation/refus), IsExecuting/StatusMessage/ProgressValue (PropertyChanged), OpenSettings (annulation, sauvegarde).
RelayCommandTests — ICommand
But : Tester l'implémentation du pattern ICommand (Execute, CanExecute, RaiseCanExecuteChanged, constructeurs, ArgumentNullException si execute null).
SettingsViewModelTests — ViewModel paramètres
But : Propriétés, extensions chiffrées, conversion ToAppSettings().
Catégories : constructeur (paramètres par défaut, v2.0 complets, anglais+XML), gestion des extensions (Add avec/sans point, pas de doublons, Remove, nombreuses extensions), ToAppSettings (valeurs correctes, copie indépendante), AvailableLanguages (fr-FR, en-US), AvailableLogFormats (JSON, XML), PropertyChanged (Language, LogFormat).
BackupExecutorV3Tests — Exécuteur v3.0 (23 tests)
But : Tester l'exécution parallèle, les fichiers prioritaires, les fichiers volumineux, le logiciel métier, et les contrôles Pause/Resume/Stop.
Catégories : exécution parallèle (3 travaux, 5 travaux concurrents, sélection spécifique, travail unique async), Pause/Resume/Stop (pause, stop avec fichiers partiels, resume après pause), contrôles globaux (PauseAll, StopAll), fichiers prioritaires (traités en premier, barrière inter-travaux, fonctionnement normal sans priorité), fichiers volumineux (sémaphore actif, petits fichiers libres), logiciel métier (processus absent, nom vide, parsing .exe), événements de progression (émis par travail, informations correctes), cas limites (liste vide, sources vides, nettoyage des contrôleurs).
JobControllerTests — Contrôleur de travail v3.0 (17 tests)
But : Tester le cycle de vie du contrôleur : état initial, transitions Pause/Resume/Stop, WaitIfPaused, CancellationToken.
Catégories : état initial (Pending, IsStopped false), Start (→ Running), Pause (depuis Running, Pending, Finished), Resume (depuis Paused, Running), Stop (→ Stopped, IsStopped true, annule le token, depuis Paused), Finish (→ Finished), WaitIfPaused (pas de blocage si Running, bloque jusqu'au Resume, débloque et annule si Stopped), cycles complets (Pending→Finished, avec pause/resume, 5 cycles consécutifs).
JobProgressViewModelTests — Progression par travail v3.0 (20 tests)
But : Tester le ViewModel de progression temps réel par travail : constructeur, mise à jour depuis JobState, commandes Pause/Resume/Stop, PropertyChanged.
Catégories : constructeur (nom, status Pending, progression 0, IsRunning), UpdateFromState (progression, compteur fichiers, Finished, Stopped), commandes (Pause, Resume, Stop existent, Resume désactivé si pas en pause, Stop activé/désactivé selon état), PropertyChanged (Progression, Status, IsPaused + IsRunning, FilesProgress).
9. Résumé des tests (176 au total)
| Catégorie | Fichier | Tests | Description |
|---|---|---|---|
| Services | BackupServiceTests.cs |
17 | CRUD des travaux, exécution, paramètres |
| Services | BackupExecutorV3Tests.cs |
23 | v3.0 : parallélisme, priorités, fichiers volumineux, logiciel métier |
| Services | JobControllerTests.cs |
17 | v3.0 : pause/resume/stop, WaitIfPaused |
| Services | CryptoSoftEngineTests.cs |
7 | Chiffrement XOR, symétrie, fichiers vides/larges |
| Services | CryptoSoftServiceTests.cs |
3 | Wrapper de timing du chiffrement |
| ViewModels | MainViewModelTests.cs |
17 | Commandes, état, interactions de dialogue |
| ViewModels | JobEditViewModelTests.cs |
14 | Validation, conversion, PropertyChanged |
| ViewModels | SettingsViewModelTests.cs |
13 | Extensions, conversion, langues, formats |
| ViewModels | JobProgressViewModelTests.cs |
20 | v3.0 : progression par travail, commandes |
| ViewModels | RelayCommandTests.cs |
8 | Execute, CanExecute, événements |
| Régression | RegressionTests.cs |
18 | Compatibilité v1.0/v1.1, sauvegarde, log, CLI |
| Total | 176 |
CI/CD (GitHub Actions)
Intégration continue et déploiement automatisé
Pipeline
Le projet utilise GitHub Actions pour automatiser la compilation, les tests
et la génération des exécutables. Le workflow ci.yml s'exécute à chaque
push et pull request sur les branches principales.
Étapes du workflow
Build & Test
Compilation (dotnet build -c Release) et exécution des tests unitaires
(dotnet test -c Release --no-build) sur 3 OS : Windows, macOS et Linux (matrix).
Publish (branches version uniquement)
Sur les branches dont le nom commence par v (ex. v1.0, v3.0), génération d'exécutables autonomes
(self-contained) par plateforme via dotnet publish, puis archivage (ZIP sous Windows, tar.gz sous Linux/macOS) et upload des artifacts (asset-windows, asset-linux, asset-macos).
Release GitHub (push sur branche version)
Lors d’un push sur une branche version, le job create-release télécharge les artifacts, crée ou met à jour la Release GitHub associée au tag (ex. v3.0) et y attache les archives (EasySave_v3.0_windows.zip, EasySave_v3.0_linux.tar.gz, EasySave_v3.0_macos.tar.gz).
Artifacts / Release
| Fichier (ex. pour v3.0) | OS | Runtime | Exécutable |
|---|---|---|---|
EasySave_<version>_windows.zip |
Windows | win-x64 |
EasySave.Avalonia.exe |
EasySave_<version>_macos.tar.gz |
macOS | osx-x64 |
EasySave.Avalonia |
EasySave_<version>_linux.tar.gz |
Linux | linux-x64 |
EasySave.Avalonia |
Télécharger les exécutables
- Ouvrir la page Releases du dépôt GitHub
- Choisir la release (ex.
v3.0) - Télécharger l’archive correspondant à votre OS (
EasySave_<version>_windows.zip,_linux.tar.gzou_macos.tar.gz) - Extraire l’archive et lancer l’exécutable
main,develop,v1.0,v1.1,v2.0,v3.0(push et pull request)- Le publish et la Release GitHub ne s’exécutent que sur les branches dont le nom commence par
v(et uniquement en push pour la release).
.github/workflows/ci.yml
Conformité au Cahier des Charges
Synthèse du respect des exigences CDC v3.0
Synthèse
Les tableaux ci-dessous rattachent les exigences du CDC v3.0 (et v1.0/v1.1/v2.0) à leur implémentation.
Exigences Fonctionnelles (v3.0)
| Exigence CDC | Statut | Implémentation |
|---|---|---|
| Interface graphique (abandon console) | ✓ | Application Avalonia UI, fenêtres XAML |
| Nombre de travaux illimité | ✓ | Plus de limite à 5 ; jobs.json et gestion dynamique des ID |
| Définition travail (nom, source, cible, type) | ✓ | Classe BackupJob ; création/édition via JobEditWindow |
| Sauvegarde complète / différentielle | ✓ | BackupType.Complete / Differential,
BackupExecutor
|
| Support multilingue (FR/EN) | ✓ | LanguageManager + Paramètres |
| Exécution mono ou séquentielle | ✓ | BackupExecutor, sélection dans l'interface ou en CLI |
| v3.0 : Exécution parallèle | ✓ | Task.WhenAll dans
BackupExecutor.ExecuteJobsInParallelAsync
|
| v3.0 : Pause / Reprise / Stop par travail | ✓ | JobController (ManualResetEventSlim +
CancellationToken)
|
| v3.0 : Fichiers prioritaires transférés en premier | ✓ | Extensions configurées dans priorityExtensions ; barrière globale
Interlocked
|
| v3.0 : Fichiers volumineux (1 à la fois) | ✓ | SemaphoreSlim(1,1) pour fichiers >
maxLargeFileTransferSizeKB
|
| v3.0 : CryptoSoft mono-instance | ✓ | Mutex nommé dans CryptoSoft + SemaphoreSlim dans
CryptoSoftService
|
| v3.0 : Auto-pause logiciel métier | ✓ | Timer 1s dans BackupExecutor ; auto-pause/reprise via
JobController
|
| Ligne de commande identique aux v1.0 et v1.1 | ✓ | EasySave.Avalonia.exe 1-3, 1;3;5 (plage / liste) |
| Format log JSON ou XML | ✓ | settings.logFormat, EasyLog.dll |
| Cryptage via CryptoSoft | ✓ | Extensions configurables ; appel CryptoSoft avant copie ; log
EncryptionTimeMs
|
| Logiciel métier : interdiction lancement + arrêt consigné en log | ✓ | businessSoftwareProcessName ; détection processus ; fin du fichier en
cours puis arrêt ; entrée dans le log |
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 |
Toutes les classes partagées entre threads parallèles sont sécurisées :
StateManager avec lock,
CryptoSoftService avec SemaphoreSlim(1,1),
ConcurrentDictionary pour les JobControllers.
Notes de Version
Historique des versions d'EasySave
Nouveautés
- Exécution parallèle : les travaux s'exécutent simultanément via
Task.WhenAlldansBackupExecutor - Pause / Reprise / Stop : contrôles en temps réel par travail via
JobController(ManualResetEventSlim+CancellationToken) - Fichiers prioritaires : extensions configurables transférées en premier
par tous les travaux (barrière globale
Interlocked) - Fichiers volumineux : un seul fichier dépassant
maxLargeFileTransferSizeKBtransféré à la fois (SemaphoreSlim(1,1)) - CryptoSoft mono-instance :
Mutexnommé empêchant les exécutions simultanées - Auto-pause logiciel métier : détection par timer (1s) ; pause automatique de tous les travaux si le processus métier est actif ; reprise automatique à la fermeture
- Paramètres v3.0 : extensions prioritaires, taille max fichier volumineux (Ko), mode de log (Local/Server/Both), URL serveur de log
- Thème Dark / Light : bouton de bascule dans l'en-tête de l'application
;
le choix persiste dans
settings.jsonentre les redémarrages - Logo & Icône : logo bouclier + flèche (SVG vectoriel) affiché dans l'en-tête et comme icône de fenêtre / barre des tâches
- Design moderne : boutons colorés sémantiques (teal = action, vert = exécution, ambre = pause, rouge = danger), cartes arrondies, styles globaux Fluent
Technique
- Nouveaux modèles :
JobStatus(enum),JobController(ManualResetEventSlim + CancellationTokenSource) - Nouveau ViewModel :
JobProgressViewModel(progression temps réel par travail) StateManagerthread-safe (locksur toutes les E/S fichier)ConcurrentDictionarypour lesJobControllers- Interface : panneau de progression par travail avec boutons Pause/Reprise/Stop
- Thème persistant : champ
themedansAppSettings;App.ToggleTheme()sauvegarde viaConfigurationManager - Icône app : rendu vectoriel
RenderTargetBitmap(64×64) à partir deStreamGeometry, mis en cache dansWindowIcon - Styles AXAML globaux : classes
.accent,.danger,.warning,.success,.ghost,.icon-btn,.carddansApp.axaml - CI/CD : workflow GitHub Actions sur
v1.0,v1.1,v2.0,v3.0,main,develop; build et tests sur Windows, Linux et macOS ; sur les branches version (v*), publish self-contained puis création/mise à jour automatique d’une Release GitHub avec les archivesEasySave_<version>_windows.zip,_linux.tar.gz,_macos.tar.gz(téléchargement depuis la page Releases) - Build : 0 erreurs, 0 warnings ; 176 tests unitaires et d'intégration
Nouveautés
- Interface graphique : abandon du mode console, application Avalonia UI (XAML)
- Travaux illimités : plus de limite à 5 travaux
- CryptoSoft : chiffrement des fichiers selon extensions définies dans les paramètres ; temps de cryptage dans le log
- Logiciel métier : détection du processus configuré ; interdiction de lancer un travail si actif ; arrêt après le fichier en cours et consignation dans le log
- Paramètres : langue, format log (JSON/XML), extensions à chiffrer, chemin logiciel métier
Technique
- Architecture MVVM ; ViewModels (Main, JobEdit, Settings) ; vues Avalonia
- Ligne de commande identique aux v1.0 et v1.1
Nouveautés
- Logs XML : choix du format de fichier log (JSON ou XML)
- Interface console améliorée ; recyclage des ID après suppression
Correctifs
- Barre de progression (0% sur différentiel vide) ; limite de 5 jobs strictement appliquée
Fonctionnalités principales
- Application Console (.NET)
- Gestion de 5 travaux de sauvegarde maximum
- Sauvegardes complètes et différentielles
- Support multilingue (FR/EN)
- Exécution séquentielle ou spécifique (CLI)
Technique
- Architecture MVC
- Logs journaliers JSON (EasyLog.dll), état temps réel (state.json)
- Support UNC et lecteurs réseaux
v1.0 — Détail complémentaire
Gestion des sauvegardes : Jusqu'à 5 travaux ; sauvegarde complète (tous les fichiers) et différentielle (fichiers modifiés) ; récursive (sous-répertoires) ; disques locaux, externes et réseau.
Modes d'exécution : Mode interactif (menu) ; ligne de commande
EasySave 1-3 ou EasySave 1;3 ; exécution séquentielle.
Multilingue : Français (par défaut), Anglais.
Journalisation : Fichiers log journaliers (YYYY-MM-DD.json), état temps
réel (state.json), chemins au format UNC.
| Composant | Version |
|---|---|
| .NET | 10.0 |
| Architecture | MVC (Console) |
| Format des données | JSON |
| Plateformes | Windows, macOS, Linux |
Limitations connues (v1.0)
- Maximum 5 travaux de sauvegarde
- Exécution séquentielle uniquement (parallèle prévu en v3.0)
- Format de log JSON uniquement (XML ajouté en v1.1)
Évolutions livrées en v2.0 (par rapport à la v1.1)
- Interface graphique (Avalonia)
- Travaux de sauvegarde illimités
- Chiffrement des fichiers (CryptoSoft)
- Détection du logiciel métier
Ces évolutions sont livrées dans la version 2.0.