2009-05-03 16 views

Respuesta

74

Puede probar uno de estos dos métodos.

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

string startupPath = Environment.CurrentDirectory; 

Dime, ¿cuál te parece mejor

+39

Estos dos puntos lo señalan al directorio bin, por lo que si tiene un directorio bin para toda su solución, lo guiará allí y NO al directorio de su proyecto (o dos niveles ABAJO del directorio del proyecto) – matcheek

+0

Environment.CurrentDirectory trabajado para mí también – MissPiplup

-6

Directory.GetParent (Directory.GetCurrentDirectory()). Parent.Parent.Parent.Parent.FullName

le dará el directorio del proyecto .

+57

realmente? Creo que te falta una matriz – sean

4

Yo estaba buscando esto también. Tengo un proyecto que ejecuta HWC, y me gustaría mantener el sitio web fuera del árbol de aplicaciones, pero no quiero mantenerlo en el directorio de depuración (o versión). Fwiw, la solución aceptada (y éste a su vez) sólo identifica el directorio del ejecutable se ejecuta en.

Para encontrar ese directorio, He estado usando

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

tuve una situación similar, y después de Googles infructuosos, declaré una cadena pública, que modificó un valor de cadena de la ruta de depuración/liberación para obtener la ruta del proyecto. Una ventaja de utilizar este método es que, ya que utiliza el directorio del proyecto currect, no importa si está trabajando desde un directorio de depuración o de un directorio de versión:

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; 
} 

A continuación, sería capaz de llamar siempre que lo desee , utilizando sólo una línea:

string MyProjectDir = DirProject(); 

Esto debería funcionar en la mayoría de casos.

2

Después de que finalmente había terminado de pulir mi primera respuesta sobre el uso de cadenas públicas para obtener una respuesta, caí en la cuenta de que probablemente podría leer un valor del registro para obtener el resultado deseado. Pues resulta que, por ese camino fue aún más corto:

En primer lugar, debe incluir el espacio de nombres Microsoft.Win32 para que pueda trabajar con el registro:

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

Este es el código principal:

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

Una nota en esta respuesta:

Estoy usando Visual Studio 2008 Professional Edition. Si está utilizando otra versión (es decir, 2003, 2005, 2010, etc.), puede que no tenga que modificar la parte 'versión' de la cadena SubKey (es decir, 8.0, 7.0; etc.).

Si usa una de mis respuestas, y si no es demasiado pedirla, me gustaría saber cuál de mis métodos utilizó y por qué. Buena suerte.

  • dm
154

espero que esto ayudará a:

Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName; 

Esto hará que el directorio del proyecto

+17

+1 para el Directory.GetParent() por lo que no obtenemos el directorio \ bin \ Debug :) –

+2

¿Qué sucede si utilizamos una CPU de destino personalizada? Por ejemplo, si configuro mi compilación para apuntar a x64, crea otra carpeta entre esas. –

+0

Esta es la respuesta correcta. La respuesta aceptada devuelve la ruta al directorio bin, que NO es el directorio del proyecto. – pookie

6

Si desea ot saber cuál es el directorio donde se encuentra su solución , necesita hacer esto:

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 solo permite el método GetCurrrentDirectory(), obtendrá la carpeta de compilación sin importar si está depurando o liberando. Espero esta ayuda! Si se olvida de las validaciones que sería como esto:

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

Otra manera de hacer esto

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

Si desea obtener la ruta a la carpeta bin

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

Tal vez hay mejores way =)

3

Use esto para obtener el directorio del proyecto (funcionó para mí):

10

Esto también le dará el directorio del proyecto navegando dos niveles desde el directorio de ejecución actual (esto no devolverá el directorio del proyecto para cada compilación, pero esta es la más común).

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

Por supuesto que desea incluir esto dentro de algún tipo de lógica de manejo de validación/error.

+0

IMO este es el método más flexible. Estoy usando esto de las pruebas unitarias y las pruebas de integración, que ruta es más profunda de una carpeta. – Soleil

2

Sin embargo, otra solución imperfecta (pero tal vez un poco más cerca de perfecto que algunos de los otros):

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); 
    } 

Esta versión volverá carpeta de los proyectos actuales incluso si el proyecto actual no es el Startup Project para la solución.

La primera falla con esto es que me salté todas las comprobaciones de error. Esto se puede solucionar con facilidad, pero solo debería ser un problema si está almacenando su proyecto en el directorio raíz de la unidad o usando una unión en su ruta (y esa unión es un descendiente de la carpeta de la solución) por lo que este escenario es poco probable . No estoy del todo seguro de que Visual Studio pueda manejar cualquiera de estas configuraciones de todos modos.

Otro problema (más probable) con el que se puede encontrar es que el nombre del proyecto debe coincidir con con el nombre de la carpeta del proyecto para que se encuentre.

Otro problema que puede tener es que el proyecto debe estar dentro de la carpeta de la solución. Por lo general, esto no es un problema, pero si ha utilizado la opción Add Existing Project to Solution para agregar el proyecto a la solución, puede que esta no sea la forma en que se organiza su solución.

Por último, si su aplicación va a modificar el directorio de trabajo, debe almacenar este valor antes de hacerlo porque este valor se determina en relación con el directorio de trabajo actual.

Por supuesto, todo esto también significa que usted no debe alterar los valores por defecto para Build de sus proyectos ->Output path o Debug ->Working directory opciones en el cuadro de diálogo de propiedades del proyecto.

Cuestiones relacionadas