2010-12-08 12 views
7

Necesito analizar una cadena de directorio que obtengo y eliminar las últimas carpetas.cuál es una buena manera de eliminar los últimos directorios

Por ejemplo, cuando tengo esta cadena directorio:

C:\workspace\AccurevTestStream\ComponentB\include 

podría tener que cortar los dos últimos Directores para crear una nueva cadena del directorio:

C:\workspace\AccurevTestStream 

lo que es una buena manera de ¿hacer esto? Sé que puedo usar la cadena split y join, pero creo que puede haber una mejor manera de hacerlo.

+0

¿Cómo va a decidir cuántos eliminar? ¿Está predeterminado? –

+0

no, es el tiempo de ejecución. – 5YrsLaterDBA

+0

Como es variable, estaría tentado de ir con 'split' y' join'. – ChrisF

Respuesta

9

Aquí es un método recursivo simple que asume que sabe cuántos directorios padres de quitar del camino:

public string GetParentDirectory(string path, int parentCount) { 
    if(string.IsNullOrEmpty(path) || parentCount < 1) 
     return path; 

    string parent = System.IO.Path.GetDirectoryName(path); 

    if(--parentCount > 0) 
     return GetParentDirectory(parent, parentCount); 

    return parent; 
} 
1

Usted puede tratar de:

myNewString = myOriginalString.SubString(0, LastIndexOf(@"\")); 
myNewString = myNewString.SubString(0, LastIndexOf(@"\")); 

No es elegante, pero debe ser eficaz.

Editar: (aún más poco elegante)

string myNewString = myOriginalString; 
for(i=0;i<NumberToChop;i++) 
{ 
    if(LastIndexOf(@"\") > 0) 
     myNewString = myNewString.SubString(0, LastIndexOf(@"\")); 
} 
+0

no, no es el último, necesito cortar uno, dos o más directorios. – 5YrsLaterDBA

+0

@ 5YrsLaterDBA: se agregó una solución aún menos elegante. Se puede soltar en un método, convertido en una extensión, whatevs. –

14
var path = "C:\workspace\AccurevTestStream\ComponentB\include";  
DirectoryInfo d = new DirectoryInfo(path); 
var result = d.Parent.Parent.FullName; 
3

usted podría utilizar la clase System.IO.Path en este caso - si llame al Path.GetDirectoryName repetidamente, cortará la última ruta:

string path = @"C:\workspace\AccurevTestStream\ComponentB\include"; 
path = Path.GetDirectoryName(path); //returns C:\workspace\AccurevTestStream\ComponentB 
path = Path.GetDirectoryName(path); //returns C:\workspace\AccurevTestStream 
//etc 
+0

¡Respuesta inteligente e incluso funciona! – Pascal

1
static String GoUp(String path, Int32 num) 
    { 
     if (num-- > 0) 
     { 
      return GoUp(Directory.GetParent(path).ToString(), num); 
     } 
     return path; 
    } 
+0

[Igual que el mío] (http://stackoverflow.com/questions/4389775/what-is-a-good-way-to-remove-last-few-directory/4389856#4389856), prácticamente. –

+2

Las grandes mentes piensan igual ©)) – QrystaL

-1

¿Qué hay de esto (lo siento, no sé lo que es su criterio para determinar qué borrar) ...

var di = new System.IO.DirectoryInfo("C:\workspace\AccurevTestStream\ComponentB\include"); 
while (!deleteDir) 
    di = di.Parent; 
di.Delete(true); 
+0

No creo que intente eliminar los directorios, solo eliminarlos de la cadena de ruta. –

0

La forma más sencilla de hacer esto:

string path = @"C:\workspace\AccurevTestStream\ComponentB\include" 
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\")); 

Nota Esto sube dos niveles. El resultado sería: newPath = @"C:\workspace\AccurevTestStream\";

Cuestiones relacionadas