Pour assemblre des segments de chemin, il est recommandé d'utiliser la méthode Path.Combine fournie par le framework plutôt que la concaténation manuelle.
string racine = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
if (!Directory.Exists(Path.Combine(racine, "Images")))
{
Directory.CreateDirectory(Path.Combine(racine, "Images"));
}
string cheminFinal = Path.Combine(racine, "Images");
Notations relatives fondamentales
Le mécanisme le plus courant repose sur la navigation depuis le répertoire d'exécution de l'application.
Répertoire courant (emplacement de l'exécutable)
// Ces deux expressions désignent le même emplacement
string fichier1 = @".\Donnees\config.xml";
string fichier2 = @"Donnees\config.xml";
// Pointe vers : [Répertoire de l'EXE]\Donnees\config.xml
Navigation vers les répertoires parents
string fichier3 = @"..\Donnees\config.xml"; // Répertoire parent immédiat
string fichier4 = @"..\..\Donnees\config.xml"; // Deux niveaux au-dessus
Techniques d'obtention des chemins de base
Voici huit approches distinctes pour récupérer les répertoires de référence, chacune avec ses particularités :
| Méthode | Description | Particularité |
|---|---|---|
Environment.CurrentDirectory |
Répretoire de lancement du processus | Peut changer durant l'exécution |
Directory.GetCurrentDirectory() |
Répertoire de travail actuel | Dépend du dernier emplacement accédé |
Application.StartupPath |
Chemin de lancement sans le nom de fichier | Stable, spécifique WinForms |
Application.ExecutablePath |
Chemin complet incluant le nom de l'exécutable | Contient le fichier .exe |
AppDomain.CurrentDomain.BaseDirectory |
Répertoire de base pour la résolution des assemblys | Termine par un séparateur |
AppDomain.CurrentDomain.SetupInformation.ApplicationBase |
Répertoire contenant l'application | Identique à BaseDirectory dans la plupart des cas |
Assembly.GetExecutingAssembly().Location |
Chemin complet de l'assembly en cours | Inclut le nom du fichier DLL/EXE |
Process.GetCurrentProcess().MainModule.FileName |
Chemin du module principal du processus | Peut retourner le fichier hôte (vshost) |
Implémentations détaillées
// Approche via l'environnement d'exécution
string viaEnvironnement = System.Environment.CurrentDirectory;
// Approche via le système de fichiers
string viaSystemeFichiers = System.IO.Directory.GetCurrentDirectory();
// Approches spécifiques aux applications Windows Forms
string demarrageSansNom = System.Windows.Forms.Application.StartupPath;
string demarrageComplet = System.Windows.Forms.Application.ExecutablePath;
// Approches via le domaine d'application
string baseDomaine = System.AppDomain.CurrentDomain.BaseDirectory;
string baseConfiguration = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
// Approches via réflexion et diagnostic
string viaAssembly = System.Reflection.Assembly.GetExecutingAssembly().Location;
string viaProcessus = System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName;
Configuration externe des chemins
Une pratique courante consiste à externaliser les chemins dans des fichiers de configuration, permettant une adaptation sans recompilation.
string cheminConfiguration = Path.Combine(
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
"Modules",
"parametres.txt"
);
using (StreamReader lecteur = new StreamReader(cheminConfiguration, Encoding.UTF8))
{
string contenu = lecteur.ReadToEnd();
// Traitement des données...
}
Point d'attention : Les méthodes CurrentDirectory sont sujettes à modification durant l'exécution (notamment par les boîtes de dialogue de sélection de fichiers). Pour des chemins stables relatifs à l'installation, privilégiez BaseDirectory ou StartupPath.