Je vois qu'il existe des moyens d'obtenir le chemin du dossier d'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)
Quelle est la meilleure façon selon la situation?
IHostEnvironment.ContentRootPath
, accessible via uneIHostEnvironment
dépendance injectée (qui contient d'autres choses utiles).Réponses:
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, ce sera le répertoire racine de l'application, pas le 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, disons, le chemin d'accès à l'exécutable Excel.
Les autres peuvent renvoyer des répertoires différents en fonction de votre environnement - voir par exemple 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, ceLocation
sera probablement le cache de téléchargement de l'assembly. CodeBase n'est pas garanti d'être défini pour les assemblys dans le GAC .la source
Path.Combine
place. Cela s'occupera de la barre oblique inverse pour vous.Application.StartupPath
et 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Ne fonctionnera que pour l' application Windows FormsSystem.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
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"
c'est là que se trouve la page que vous exécutez.AppDomain.CurrentDomain.BaseDirectory
pour l'application Web pourrait être utile et retournera quelque chose comme le"C:\\hg\\Services\\Services\\Services.Website\\"
répertoire de base et est très utile.System.IO.Directory.GetCurrentDirectory()
et 5.Environment.CurrentDirectory
vous donnera l'emplacement d'où le processus a été déclenché - 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 donnera l'emplacement où
.dll
est exécuté le code, pour une application Web qui pourrait être"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
Maintenant, dans le cas par exemple de l'application console, les points 2-6 seront le répertoire où se
.exe
trouve le fichier.J'espère que cela vous fera gagner du temps.
la source
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:
renvoie le
StartupPath
paramètre (peut être défini lors de l'exécution de l'application)renvoie le répertoire en cours, qui peut être ou non le dossier dans lequel se trouve l'application. Il en va de même
Environment.CurrentDirectory
. Dans le cas où vous l'utilisez dans un fichier DLL, il renverra le chemin où le processus s'exécute (cela est particulièrement vrai dans ASP.NET).la source
GetCurrentDirectory()
, pour l'amour de courir des choses de différents chemins! :(Pour une application Web, pour obtenir le répertoire racine de l'application Web actuelle, appelez généralement par page Web pour la demande entrante actuelle:
Description du code ci-dessus
la source
J'ai démarré un processus à partir d'un service Windows sur l'API Win32 dans la session de l'utilisateur qui est réellement connecté (dans la session 1 du Gestionnaire des tâches et non 0). Dans ce cas, nous pouvons savoir quelle variable est la meilleure.
Pour les 7 cas de la question ci-dessus, les résultats sont les suivants:
Il est peut-être utile pour certains d'entre vous de faire la même chose lorsque vous recherchez la meilleure variable pour votre cas.
la source
D'après mon expérience, la meilleure façon est une combinaison de ces éléments.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Vous donnera le dossier binDirectory.GetCurrentDirectory()
Fonctionne bien sur .Net Core mais pas .Net et vous donnera le répertoire racine du projetSystem.AppContext.BaseDirectory
etAppDomain.CurrentDomain.BaseDirectory
Fonctionne bien dans .Net mais pas .Net core et vous donnera le répertoire racine du projetDans une bibliothèque de classe qui est censée cibler le noyau .Net et .Net, je vérifie quel framework héberge la bibliothèque et je choisis l'un ou l'autre.
la source
J'ai utilisé celui-ci avec succès
Cela fonctionne même à l'intérieur de linqpad.
la source
Répertoire racine:
la source
Si vous savez obtenir le répertoire racine:
la source
celui-ci a
System.IO.Path.GetDirectory(Application.ExecutablePath)
changé enSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)
la source