Comment trouver le chemin de l'application dans une application console?
Dans Windows Forms, Je peux utiliser Application.StartupPath
pour trouver le chemin actuel, mais cela ne semble pas être disponible dans une application console.
Comment trouver le chemin de l'application dans une application console?
Dans Windows Forms, Je peux utiliser Application.StartupPath
pour trouver le chemin actuel, mais cela ne semble pas être disponible dans une application console.
System.Reflection.Assembly.GetExecutingAssembly()
.Location
1
Combinez cela avec System.IO.Path.GetDirectoryName
si tout ce que vous voulez est le répertoire.
1Selon le commentaire de Mr.Mindor:
System.Reflection.Assembly.GetExecutingAssembly().Location
renvoie l'emplacement où se trouve actuellement l'assembly en cours d'exécution, lequel peut ou non se trouver à l'emplacement de l'assembly lorsqu'il ne s'exécute pas. Dans le cas des assemblys de copie d'ombre, vous obtiendrez un chemin dans un répertoire temp.System.Reflection.Assembly.GetExecutingAssembly().CodeBase
retournera le chemin 'permanent' de l'assemblage.
Vous pouvez utiliser le code suivant pour obtenir le répertoire d'application en cours.
AppDomain.CurrentDomain.BaseDirectory
Vous avez deux options pour trouver le répertoire de l'application, que vous avez choisi dépendra de votre objectif.
// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests,
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);
Probablement un peu en retard mais cela vaut la peine d'être mentionné:
Environment.GetCommandLineArgs()[0];
Ou plus exactement pour obtenir juste le chemin du répertoire:
System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Modifier:
Beaucoup de gens ont fait remarquer que GetCommandLineArgs
n'est pas garanti de retourner le nom du programme. Voir Le premier mot sur la ligne de commande est le nom du programme uniquement par convention. L'article indique que "Bien que très peu de programmes Windows utilisent cette bizarrerie (je ne suis pas au courant de moi-même)". Il est donc possible de "spoofer" GetCommandLineArgs
, mais nous parlons d'une application console. Les applications de la console sont généralement rapides et sales. Cela correspond donc à ma philosophie KISS.
Pour toute personne intéressée par les applications Web asp.net. Voici mes résultats de 3 méthodes différentes
protected void Application_Start(object sender, EventArgs e)
{
string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
string p3 = this.Server.MapPath("");
Console.WriteLine("p1 = " + p1);
Console.WriteLine("p2 = " + p2);
Console.WriteLine("p3 = " + p3);
}
résultat
p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging
l'application fonctionne physiquement à partir de "C: \ inetpub \ SBSPortal_staging", donc la première solution n'est certainement pas appropriée pour les applications web.
La réponse ci-dessus était de 90% de ce dont j'avais besoin, mais j'ai retourné un Uri au lieu d'un chemin régulier pour moi.
Comme expliqué dans le message sur les forums MSDN, Comment convertir un chemin URI en chemin de fichier normal?, J'ai utilisé ce qui suit:
// Get normal filepath of this assembly's permanent directory
var path = new Uri(
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
).LocalPath;
Vous cherchez peut-être à faire ceci:
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
vous pouvez utiliser celui-ci à la place.
System.Environment.CurrentDirectory