web-dev-qa-db-fra.com

Comment obtenir le répertoire du projet actuel à partir du code C # lors de la création d'une tâche MSBuild personnalisée?

Au lieu d'exécuter un programme externe avec son chemin codé en dur, j'aimerais obtenir le Dir du projet actuel. J'appelle un programme externe en utilisant un processus dans la tâche personnalisée.

Comment je ferais ça? AppDomain.CurrentDomain.BaseDirectory me donne simplement l'emplacement de VS 2008.

93
sean

Vous pouvez essayer l'une de ces deux méthodes.

string startupPath = System.IO.Directory.GetCurrentDirectory();

string startupPath = Environment.CurrentDirectory;

Dis-moi, lequel te semble le mieux

95
Iralda Mitro
using System;
using System.IO;

// This will get the current WORKING directory (i.e. \bin\Debug)
string workingDirectory = Environment.CurrentDirectory;
// or: Directory.GetCurrentDirectory() gives the same result

// This will get the current PROJECT directory
string projectDirectory = Directory.GetParent(workingDirectory).Parent.FullName;
200
mohammed sameeh

Cela vous donnera également le répertoire du projet en naviguant à deux niveaux à partir du répertoire en cours d'exécution (cela ne renverra pas le répertoire du projet pour chaque construction, mais c'est le plus courant).

System.IO.Path.GetFullPath(@"..\..\")

Bien sûr, vous voudriez contenir ceci dans une sorte de logique de traitement de validation/erreur.

16
nh43de

Si vous voulez savoir quel est le répertoire dans lequel se trouve votre solution, procédez comme suit:

 var parent = Directory.GetParent(Directory.GetCurrentDirectory()).Parent;
            if (parent != null)
            {
                var directoryInfo = parent.Parent;
                string startDirectory = null;
                if (directoryInfo != null)
                {
                    startDirectory = directoryInfo.FullName;
                }
                if (startDirectory != null)
                { /*Do whatever you want "startDirectory" variable*/}
            }

Si vous laissez uniquement avec la méthode GetCurrrentDirectory(), vous obtenez le dossier de construction, peu importe si vous êtes en train de déboguer ou de libérer. J'espère que cette aide! Si vous oubliez les validations, ce serait comme ceci:

var startDirectory = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
8
abel406

Si un projet s'exécute sur un IIS Express, le Environment.CurrentDirectory pourrait pointer vers l'emplacement de IIS Express (le chemin par défaut serait C:\Program Files (x86)\IIS Express ). , pas à où réside votre projet.


C'est probablement le chemin de répertoire le plus approprié pour divers types de projets.

AppDomain.CurrentDomain.BaseDirectory

C'est la définition MSDN.

Obtient le répertoire de base que le résolveur d'assemblage utilise pour rechercher des assemblys.

8
hina10531

Je cherchais ça aussi. J'ai un projet qui exécute HWC et j'aimerais garder le site Web en dehors de l'arborescence des applications, mais je ne veux pas le conserver dans le répertoire debug (ou release). FWIW, la solution acceptée (et celle-ci également) identifie uniquement le répertoire dans lequel s'exécute l'exécutable. 

Pour trouver ce répertoire, j'ai utilisé 

string startupPath = System.IO.Path.GetFullPath(".\\").
5
Brett

Encore une solution imparfaite (mais peut-être un peu plus proche de la perfection que certaines autres):

    protected static string GetSolutionFSPath() {
        return System.IO.Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.FullName;
    }
    protected static string GetProjectFSPath() {
        return String.Format("{0}\\{1}", GetSolutionFSPath(), System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
    }

Cette version renverra le dossier projets en cours} même si le projet en cours n'est pas le Startup Project pour la solution.

La première faille avec ceci est que j'ai ignoré toute vérification d'erreur. Cela peut être résolu assez facilement mais cela ne devrait poser problème que si vous stockez votre projet dans le répertoire racine du lecteur ou utilisez une jonction dans votre chemin (et que cette jonction est un descendant du dossier de la solution). Ce scénario est donc peu probable. . Je ne suis pas tout à fait sûr que Visual Studio puisse gérer ces configurations de toute façon.

Un autre problème (plus probable) que vous pouvez rencontrer est que le nom du projet doit correspondre au nom du dossier du projet pour qu'il soit trouvé.

Un autre problème que vous pouvez avoir est que le projet doit se trouver dans le dossier de la solution. Ce n'est généralement pas un problème, mais si vous avez utilisé l'option Add Existing Project to Solution pour ajouter le projet à la solution, il se peut que ce ne soit pas la façon dont votre solution est organisée.

Enfin, si votre application va modifier le répertoire de travail, vous devez stocker cette valeur avant de le faire car cette valeur est déterminée par rapport au répertoire de travail actuel. 

Bien entendu, cela signifie également que vous ne devez pas modifier les valeurs par défaut des options Build-> Output path ou Debug-> Working directory de vos projets dans la boîte de dialogue des propriétés du projet.

4
krowe

Une autre façon de faire ça 

string startupPath = System.IO.Directory.GetParent(@"./").FullName;

Si vous voulez obtenir le chemin du dossier bin

string startupPath = System.IO.Directory.GetParent(@"../").FullName;

Peut-être y a-t-il un meilleur moyen =)

4
Tret

J'ai eu une situation similaire, et après Googles infructueux, j'ai déclaré une chaîne publique, qui modifie une valeur de chaîne du chemin de débogage/libération pour obtenir le chemin du projet. L'avantage d'utiliser cette méthode est que, comme elle utilise le répertoire du projet currect, le fait que vous travailliez à partir d'un répertoire de débogage ou d'un répertoire de publication n'a pas d'importance:

public string DirProject()
{
    string DirDebug = System.IO.Directory.GetCurrentDirectory();
    string DirProject = DirDebug;

    for (int counter_slash = 0; counter_slash < 4; counter_slash++)
    {
        DirProject = DirProject.Substring(0, DirProject.LastIndexOf(@"\"));
    }

    return DirProject;
}

Vous pourrez alors l'appeler quand vous le souhaitez, en utilisant une seule ligne:

string MyProjectDir = DirProject();

Cela devrait fonctionner dans la plupart cas.

3
digitalmythology

Utilisez ceci pour obtenir le répertoire du projet (travaillé pour moi):

string projectPath = 
    Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;
3
user5219877

Après avoir enfin fini de peaufiner ma première réponse concernant l'utilisation de chaînes publiques pour obtenir une réponse, je me suis rendu compte que vous pouviez probablement lire une valeur dans le registre pour obtenir le résultat souhaité. En fin de compte, cette route était encore plus courte:

Tout d'abord, vous devez inclure l'espace de noms Microsoft.Win32 afin de pouvoir utiliser le registre:

using Microsoft.Win32;    // required for reading and / or writing the registry

Voici le code principal:

RegistryKey Projects_Key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Microsoft\VisualStudio\9.0", false);
string DirProject = (string)Projects_Key.GetValue(@"DefaultNewProjectLocation");

Une note sur cette réponse:

J'utilise Visual Studio 2008 Professional Edition. Si vous utilisez une autre version (2003, 2005, 2010, etc.), vous ne devrez peut-être pas modifier la partie "version" de la chaîne SubKey (par exemple, 8.0, 7.0, etc.).

Si vous utilisez l'une de mes réponses et si ce n'est pas trop demander, j'aimerais savoir laquelle de mes méthodes vous avez utilisée et pourquoi. Bonne chance. 

  • dm
3
digitalmythology

Essayez ceci, c'est simple

HttpContext.Current.Server.MapPath("~/FolderName/");
3
Hardeep Singh

Cette solution fonctionne bien pour moi, sur Develop ainsi que sur les serveurs TEST et PROD avec ASP.NET MVC5 via C #:

var projectDir = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);

Si vous avez besoin de répertoire du projet dans le fichier de configuration du projet utilisez:

$(ProjectDir)
2
Jan Sršeň

D'après la réponse de Gucu112 , mais pour l'application .NET Core Console/Window, il devrait être:

string projectDir = 
    Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\..\.."));

J'utilise ceci dans un projet xUnit pour une application .NET Core Window.

2
zwcloud

Essayer:

var pathRegex = new Regex(@"\\bin(\\x86|\\x64)?\\(Debug|Release)$", RegexOptions.Compiled);
var directory = pathRegex.Replace(Directory.GetCurrentDirectory(), String.Empty);

Cette solution, différente des autres, tient également compte de la construction possible x86 ou x64 

1
David Desmaisons

J'ai utilisé la solution suivante pour faire le travail:

string projectDir =
    Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\.."));
1
Gucu112

La meilleure solution

string PjFolder1 =
    Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).
        Parent.Parent.FullName;

Autre solution 

string pjFolder2 = Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(
                System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)));

Testez-le, AppDomain.CurrentDomain.BaseDirectory a fonctionné pour moi sur le projet précédent, maintenant je reçois le dossier de débogage .... la bonne réponse sélectionnée ne fonctionne tout simplement pas!.

//Project DEBUG folder, but STILL PROJECT FOLDER
string pjDebugFolder = AppDomain.CurrentDomain.BaseDirectory;

//Visual studio folder, NOT PROJECT FOLDER
//This solutions just not work
string vsFolder = Directory.GetCurrentDirectory();
string vsFolder2 = Environment.CurrentDirectory;
string vsFolder3 = Path.GetFullPath(".\\");   

//Current PROJECT FOLDER
string ProjectFolder = 
    //Get Debug Folder object from BaseDirectory ( the same with end slash)
    Directory.GetParent(pjDebugFolder).
    Parent.//Bin Folder object
    Parent. //Project Folder object
    FullName;//Project Folder complete path
0
Eduardo Chávez
using System;
using System.IO;

// Get the current directory and make it a DirectoryInfo object.
var currentDirectory = new DirectoryInfo(Environment.CurrentDirectory);

// On windows, the current directory is the compiled binary sits,
// so string like @"bin\Release\netcoreapp2.0" will follow the project directory. 
// Hense, the project directory is the great grand-father of the current directory.
string projectDirectory = currentDirectory.Parent.Parent.Parent.FullName;
0
JeffreyYe_THU