web-dev-qa-db-fra.com

Meilleur moyen d'obtenir le chemin du dossier de l'application

Je vois qu'il y a plusieurs façons d'obtenir le chemin du dossier de l'application:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

Quel est le meilleur moyen en fonction de la situation?

416
Leo Vo

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 .

426
Joe
  1. Application.StartupPathand 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath) - Ne fonctionne que pour Application Windows Forms

  2. 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.

  3. 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.

  4. 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"

  1. 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.

57
Matas Vaitkevicius

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).

55
Vimvq1987

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;

Description de code ci-dessus

6
Raj kumar

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.

1
Beetee

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.

1
camilohe

Répertoire racine:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
0
Alparslan ŞEN

Si vous savez obtenir le répertoire racine:

string rootPath = Path.GetPathRoot(Application.StartupPath)
0
Alparslan ŞEN

celui-ci "System.IO.Path.GetDirectory (Application.ExecutablePath)" remplacé par System.IO.Path.GetDirectoryName (Application.ExecutablePath)

0
nazim hatipoglu

D'après mon expérience, le meilleur moyen est une combinaison de ceux-ci.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase Vous donnera le dossier bin
  2. Directory.GetCurrentDirectory()Works fonctionne bien sur .Net Core mais pas .Net et vous donnera le répertoire racine du projet.
  3. System.AppContext.BaseDirectory et AppDomain.CurrentDomain.BaseDirectoryWorks fine en .Net mais pas .Net core et vous donnera le répertoire racine du projet

Dans 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.

0
Ahmed Mansour