¿Ruta relativa a la ruta absoluta en C #?

86

Tengo archivos xml que contienen rutas de archivo href a imágenes (por ejemplo, ".... \ images \ image.jpg"). Los hrefs contienen rutas relativas. Ahora, necesito extraer los hrefs de las imágenes y convertirlos en rutas absolutas en el sistema de archivos.

Sé sobre el método GetFullPath, pero lo probé y solo parece funcionar desde el conjunto CurrentDirectory, que parece ser C: así que no veo cómo podría usarlo. Y aún así, tengo la ruta absoluta del archivo que contiene los hrefs y las rutas relativas de href, así que, dado que es una tarea simple para mí, contar el número de partes ".... \" basado en la ruta absoluta el archivo que lo contiene, parece que también debe haber una forma de hacerlo mediante programación.

¡Espero que haya algún método simple que simplemente no conozca! ¿Algunas ideas?

Anders
fuente
2
¿Es esta una aplicación de escritorio o web?
Chris Kooken

Respuestas:

104

Suponiendo que conozca el directorio real en el que se encuentra el archivo XML, use Path.Combine, eg

var absolute_path = Path.Combine(directoryXmlLivesIn, "..\images\image.jpg");

Si desea recuperar la ruta completa con cualquier ... colapsado, puede usar:

Path.GetFullPath((new Uri(absolute_path)).LocalPath);
Paolo
fuente
1
Gracias, mi problema aparentemente fue que me había olvidado de obtener el directorio del archivo xml primero, había intentado Combinar, pero con la ruta absoluta del archivo, que no funcionó. No sé cuál de todas estas respuestas fue la primera, el tiempo muestra lo mismo, pero usted señaló para obtener el directorio, así que elegí su respuesta. ¡Gracias a todos!
Anders
10
Con un poco de experimentación, parece que (new Uri(absolute_path)).LocalPathhace lo mismo, por Path.GetFullPath(absolute_path)lo que uno u otro debería ser suficiente.
Tim Lewis
1
¡Tenga en cuenta que Uri tiene un manejo especial de "#" o "&" que no desea cuando maneja rutas y nombres de archivos!
MatsW
1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpath establece Gets a local operating-system representation of a file name.que, en este caso, no se espera un manejo especial.
FrankM
142
string exactPath = Path.GetFullPath(yourRelativePath);

trabajos

cahit beyaz
fuente
14
esta es la respuesta correcta a la pregunta "¿cómo se convierte una ruta relativa en una ruta absoluta?" el OP solo quería saber la respuesta a '¿cómo se adhieren a trozos de caminos juntos?'
JonnyRaa
2
Al principio pensé que esto no funcionaba, pero funciona. Si alimenta su ruta relativa de C: \ test \ A \ .. \ B \ test.txt La salida será C: \ test \ B \ test.txt
BraveNewMath
34

Esto funcionó.

var s = Path.Combine(@"C:\some\location", @"..\other\file.txt");
s = Path.GetFullPath(s);
David Crowell
fuente
9

¡Es la mejor manera de convertir la ruta relativa en la ruta absoluta!

string absolutePath = System.IO.Path.GetFullPath(relativePath);
Mohammad Fathi MiMFa
fuente
6

Puede usar Path.Combine con la ruta "base", luego GetFullPath en los resultados.

string absPathContainingHrefs = GetAbsolutePath(); // Get the "base" path
string fullPath = Path.Combine(absPathContainingHrefs, @"..\..\images\image.jpg");
fullPath = Path.GetFullPath(fullPath);  // Will turn the above into a proper abs path
Reed Copsey
fuente
5

¿Has probado el Server.MapPathmétodo? Aquí hay un ejemplo

string relative_path = "/Content/img/Upload/Reports/59/44A0446_59-1.jpg";
string absolute_path = Server.MapPath(relative_path);
//will be c:\users\.....\Content\img\Upload\Reports\59\44A0446_59-1.jpg
Tianzhen Lin
fuente
1

Esto funcionó para mí.

//used in an ASP.NET MVC app
private const string BatchFilePath = "/MyBatchFileDirectory/Mybatchfiles.bat"; 
var batchFile = HttpContext.Current.Server.MapPath(BatchFilePath);
Jonny Boy
fuente