Je vois qu'il y a plusieurs façons d'obtenir le chemin du dossier de l'application:
Application.StartupPath
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
AppDomain.CurrentDomain.BaseDirectory
System.IO.Directory.GetCurrentDirectory()
Environment.CurrentDirectory
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
System.IO.Path.GetDirectory(Application.ExecutablePath)
Quel est le meilleur moyen en fonction de la situation?
AppDomain.CurrentDomain.BaseDirectory
est probablement le plus utile pour accéder aux fichiers dont l'emplacement est relatif au répertoire d'installation de l'application.
Dans une application ASP.NET, il s'agira du répertoire racine de l'application, et non du sous-dossier bin - ce qui est probablement ce que vous voulez habituellement. Dans une application cliente, ce sera le répertoire contenant l'exécutable principal.
Dans une application VSTO 2005, ce sera le répertoire contenant les assemblys gérés VSTO pour votre application et non, par exemple, le chemin d'accès à l'exécutable Excel.
Les autres peuvent renvoyer des répertoires différents selon votre environnement - par exemple, reportez-vous à la réponse de @ Vimvq1987.
CodeBase
est l'endroit où un fichier a été trouvé et peut être une URL commençant par http: //. Dans ce cas, Location
sera probablement le cache de téléchargement de l’Assemblée. Il n'est pas garanti que CodeBase soit défini pour les assemblys dans le répertoire GAC .
Application.StartupPath
and 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Ne fonctionne que pour Application Windows Forms
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location)
Est-ce que va vous donner quelque chose comme: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\Assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"
qui est où la page que vous exécutez est.
AppDomain.CurrentDomain.BaseDirectory
pour une application Web pourrait être utile et renverra quelque chose comme "C:\\hg\\Services\\Services\\Services.Website\\"
, qui est un répertoire de base et est très utile.
System.IO.Directory.GetCurrentDirectory()
et 5. Environment.CurrentDirectory
vous obtiendrez l'emplacement d'où le processus a été lancé - donc pour une application Web exécutée en mode débogage à partir de Visual Studio, quelque chose comme "C:\\Program Files (x86)\\IIS Express"
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
vous obtiendrez l'emplacement où .dll
qui exécute le code est, pour une application Web qui pourrait être "file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
Maintenant, dans le cas, par exemple, de la console d'application, les points 2 à 6 seront le répertoire où se trouve le fichier .exe
.
J'espère que cela vous fait gagner du temps.
Notez que toutes ces méthodes ne renverront pas la même valeur. Dans certains cas, ils peuvent renvoyer la même valeur, mais attention, leurs objectifs sont différents:
Application.StartupPath
renvoie le paramètre StartupPath
(peut être défini lors de l'exécution de l'application)
System.IO.Directory.GetCurrentDirectory()
renvoie le répertoire en cours, qui peut être ou non le dossier dans lequel se trouve l'application. La même chose vaut pour Environment.CurrentDirectory
. Si vous utilisez ceci dans un fichier DLL, il renverra le chemin du lieu d'exécution du processus (c'est particulièrement vrai dans ASP.NET).
Pour une application Web, pour obtenir le répertoire racine de l'application Web en cours, appelez généralement par page Web pour la demande entrante en cours:
HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
J'ai démarré un processus à partir d'un service Windows via l'API Win32 dans la session de l'utilisateur actuellement connecté (dans la session du gestionnaire de tâches 1, pas 0). En cela, nous pouvons savoir quelle variable est la meilleure.
Pour les 7 cas de la question ci-dessus, voici les résultats:
Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram
C’est peut-être utile pour certains d’entre vous de faire la même chose lorsque vous recherchez la meilleure variable pour votre cas.
J'ai utilisé celui-ci avec succès
System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
Cela fonctionne même à l'intérieur de linqpad.
Répertoire racine:
DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
Si vous savez obtenir le répertoire racine:
string rootPath = Path.GetPathRoot(Application.StartupPath)
celui-ci "System.IO.Path.GetDirectory (Application.ExecutablePath)" remplacé par System.IO.Path.GetDirectoryName (Application.ExecutablePath)
D'après mon expérience, le meilleur moyen est une combinaison de ceux-ci.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Vous donnera le dossier binDirectory.GetCurrentDirectory()
Works fonctionne bien sur .Net Core mais pas .Net et vous donnera le répertoire racine du projet.System.AppContext.BaseDirectory
et AppDomain.CurrentDomain.BaseDirectory
Works fine en .Net mais pas .Net core et vous donnera le répertoire racine du projetDans une bibliothèque de classe supposée cibler .Net et le noyau .Net, je vérifie quel framework héberge la bibliothèque et en choisit un.