Utilizo este código para encontrar el directorio de depuración
public string str_directory = Environment.CurrentDirectory.ToString();
"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug"
¿Cómo puedo encontrar la carpeta principal como se muestra a continuación?
"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj"
c#
directory
filesystems
Masoud Abasian
fuente
fuente
Respuestas:
Puede utilizar
System.IO.Directory.GetParent()
para recuperar el directorio principal de un directorio determinado.fuente
DirectoryInfo.Parent
. ejnew System.IO.DirectoryInfo("c:/path/to/somewhere//").Parent
. @northbenstring parent = System.IO.Directory.GetParent(str_directory).FullName;
Ver BOL
fuente
Si agrega
..\..
a su ruta existente, el sistema operativo examinará correctamente la carpeta principal.Eso debería hacer el trabajo:
System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");
Si explora esa ruta, explorará el directorio de los abuelos.
fuente
He descubierto que las variantes de
System.IO.Path.Combine(myPath, "..")
son las más fáciles y fiables. Más aún si lo que dice Northben es cierto, GetParent requiere una llamada adicional si hay una barra al final. Eso, para mí, no es confiable.Path.Combine se asegura de que nunca te equivoques con las barras.
..
se comporta exactamente como lo hace en cualquier otro lugar de Windows. Puede agregar cualquier número de\..
a una ruta en cmd o explorer y se comportará exactamente como describo a continuación.Algún
..
comportamiento básico :..
lo cortará:Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..")
=>D:\Grandparent\Parent\
..
subirá un nivel:Path.Combine(@"D:\Grandparent\Parent\", "..")
=>D:\Grandparent\
..\..
sigue las mismas reglas, dos veces seguidas:Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..")
=>D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", @"..\..")
=>D:\
Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..")
=>D:\Grandparent\
Path.Combine(@"D:\Grandparent\Parent\", "..", "..")
=>D:\
fuente
Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..")
=D:\Grandparent\Parent\Child.txt\..
Path.Combine
no trunca la cadena en sí. La ruta , una vez utilizada para acceder al sistema de archivos, tiene el efecto deseado. Sin embargo, estoy de acuerdo en que esto no es óptimo. Vea mi respuesta más reciente en esta página para conocer un enfoque que modifica la cadena en lugar de necesitar el sistema de archivos para resolver la ruta.Para obtener un directorio de 'abuelos', llame a Directory.GetParent () dos veces:
var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
fuente
var gparent = Directory.GetParent(str_directory).Parent; // Cleaner?
Directory.GetParent
es probablemente una respuesta mejor, pero por lo completo que hay un método diferente que tiene cadena y devuelve la cadena:Path.GetDirectoryName
.string parent = System.IO.Path.GetDirectoryName(str_directory);
fuente
Me gusta esto:
System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory); string parentDirectory = myDirectory.Parent.FullName;
¡Buena suerte!
fuente
Es posible que desee examinar el
DirectoryInfo
.Parent
propiedad.fuente
Para evitar problemas con el seguimiento de \, llámelo de esta manera:
string ParentFolder = Directory.GetParent( folder.Trim('\\')).FullName;
fuente
TrimEnd
si solo desea eliminar el final`'s . I'm not sure if a leading
`es significativo en otros sistemas operativos.Para obtener tu solución, prueba esto
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
fuente
Esta es la forma más común, realmente depende de lo que esté haciendo exactamente: (Para explicar, el ejemplo a continuación eliminará los últimos 10 caracteres, que es lo que solicitó, sin embargo, si hay algunas reglas comerciales que impulsan su necesidad para encontrar una ubicación específica, debe usarlos para recuperar la ubicación del directorio, no encontrar la ubicación de otra cosa y modificarla).
// remove last 10 characters from a string str_directory = str_directory.Substring(0,str_directory.Length-10);
fuente
\bin\Debug
, sin` and no other path, so it's extraordinarily fragile. Your second doesn't work because
Environment.CurrentDirectory` final es una cadena, y las cadenas no tienen unaParent
propiedad.Nadie ha proporcionado una solución que funcione de forma cruzada. Sé que no se preguntó específicamente, pero estoy trabajando en un entorno Linux donde la mayoría de las soluciones (como en el momento en que publico esto) proporcionarían un error.
Los separadores de ruta de codificación rígida (así como otras cosas) darán un error en cualquier cosa menos en los sistemas Windows.
En mi solución original usé:
char filesep = Path.DirectorySeparatorChar; string datapath = $"..{filesep}..{filesep}";
Sin embargo, después de ver algunas de las respuestas aquí, lo ajusté para que sea:
string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName;
fuente
Dado que nada más que he encontrado ayuda a resolver esto de una manera verdaderamente normalizada, aquí hay otra respuesta.
Tenga en cuenta que algunas respuestas a preguntas similares intentan usar el
Uri
tipo, pero eso tiene dificultades con las barras diagonales finales frente a las barras inclinadas no.Mi otra respuesta en esta página funciona para las operaciones que ponen el sistema de archivos de trabajo, pero si queremos tener el camino resuelto en este momento (por ejemplo, por razones de comparación), sin pasar por el sistema de archivos,
C:/Temp/..
yC:/
sería considerado diferente. Sin pasar por el sistema de archivos, navegar de esa manera no nos proporciona una ruta normalizada y adecuadamente comparable.¿Qué podemos hacer?
Nos basaremos en el siguiente descubrimiento:
string
, no comochar
) tratará unanull
ruta de la misma manera que trata""
.GetDirectoryName
se abstendrá de descartar el último componente de la ruta gracias a la barra inclinada agregada.GetDirectoryName
normalizará barras y puntos de navegación...
navegando hacia arriba.GetDirectoryName
volveránull
por un camino vacío, al que nos fusionamos""
.¿Cómo usamos esto?
Primero, normalice la ruta de entrada :
dirPath = Path.GetDirectoryName(dirPath + "/") ?? "";
Luego, podemos obtener el directorio principal y podemos repetir esta operación cualquier cantidad de veces para navegar más hacia arriba:
// This is reliable if path results from this or the previous operation path = Path.GetDirectoryName(path);
Tenga en cuenta que nunca hemos tocado el sistema de archivos. No es necesario que exista ninguna parte del camino, como lo haría si lo hubiéramos utilizado
DirectoryInfo
.fuente
No deberías intentar hacer eso. Environment.CurrentDirectory le proporciona la ruta del directorio ejecutable. Esto es coherente independientemente de dónde esté el archivo .exe. No debe intentar acceder a un archivo que se supone que está en una ubicación relativa hacia atrás
Le sugiero que mueva cualquier recurso al que desee acceder a una ubicación local. De un directorio del sistema (como AppData)
fuente
IO.Path.GetFullPath(@"..\..")
Si borra "
bin\Debug\
" en las propiedades del proyecto -> Generar -> Ruta de salida, entonces puede usarAppDomain.CurrentDomain.BaseDirectory
fuente