2011-12-15 113 views
7

En C# si tengo una ruta de directorio y una ruta de archivo relativa con comodín, "c:\foo\bar" y "..\blah\*.cpp", ¿hay una manera simple de obtener la lista de rutas de archivos absolutas, { "c:\foo\blah\a.cpp", "c:\foo\blah\b.cpp" }?Resolviendo la ruta relativa con comodín en C#

Antecedentes: existe un árbol de fuentes que cualquier directorio puede contener un archivo de definición de compilación, que usa una ruta relativa con un comodín para especificar los archivos de origen. La tarea aquí es generar una lista de ruta absoluta de todos los archivos fuente para cada archivo de definición de compilación.

+0

System.IO.Directory.EnumerateFiles le permite especificar caracteres comodín en el parámetro searchPattern, ver : http://msdn.microsoft.com/en-us/library/dd413233.aspx y devolverá rutas absolutas – Polity

+0

@Polity, System.ArgumentException: el patrón de búsqueda no puede contener ".." para mover directorios –

Respuesta

3

, usted puede obtener la ruta absoluta primero y luego enumerar los archivos dentro del directorio que coinciden con el comodín:

// input 
string rootDir = @"c:\foo\bar"; 
string originalPattern = @"..\blah\*.cpp"; 

// Get directory and file parts of complete relative pattern 
string pattern = Path.GetFileName (originalPattern); 
string relDir = originalPattern.Substring (0, originalPattern.Length - pattern.Length); 
// Get absolute path (root+relative) 
string absPath = Path.GetFullPath (Path.Combine (rootDir ,relDir)); 

// Search files mathing the pattern 
string[] files = Directory.GetFiles (absPath, pattern, SearchOption.TopDirectoryOnly); 
+0

Path.GetFullPath () arroja ArgumentException: caracteres ilegales en la ruta, si la ruta contiene algún comodín. –

+0

Tiene razón, actualicé mi código de modo que el patrón de búsqueda relativo primero se divide en información de directorio y de archivo y luego se determina la ruta absoluta –

+0

¡Funciona! Aún mejor, en lugar de 'cadena relDir = originalPattern.Substring (0, originalPattern.Length - pattern.Length);' Podemos usar 'cadena relDir = Path.GetDirectoryName (originalPattern);' –

0

Es simple.

using System.IO; 
     . 
     . 
     . 
string[] files = Directory.GetFiles(@"c:\", "*.txt", SearchOption.TopDirectoryOnly);