Jalur relatif ke jalur absolut di C #?

86

Saya memiliki file xml yang berisi jalur file href ke gambar (mis. ".... \ images \ image.jpg"). Hrefs berisi jalur relatif. Sekarang, saya perlu mengekstrak hrefs ke gambar dan mengubahnya menjadi jalur absolut dalam sistem file.

Saya tahu tentang metode GetFullPath, tetapi saya mencobanya dan tampaknya hanya berfungsi dari kumpulan CurrentDirectory, yang tampaknya C: jadi saya tidak melihat bagaimana saya bisa menggunakannya. Dan tetap saja, saya memiliki jalur absolut dari file yang berisi hrefs, dan jalur relatif href, jadi karena ini adalah tugas sederhana bagi saya untuk menghitung kembali jumlah bagian ".... \" berdasarkan jalur absolut dari file yang berisi, tampaknya harus ada cara untuk melakukan ini secara terprogram juga.

Saya berharap ada beberapa metode sederhana yang tidak saya ketahui! Ada ide?

Anders
sumber
2
Apakah ini aplikasi desktop atau web?
Chris Kooken

Jawaban:

106

Dengan asumsi Anda mengetahui direktori sebenarnya, file XML berada dalam penggunaan Path.Combine, misalnya

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

Jika Anda ingin mendapatkan kembali jalur lengkap dengan apa pun .. yang diciutkan maka Anda dapat menggunakan:

Path.GetFullPath((new Uri(absolute_path)).LocalPath);
Paolo
sumber
1
Terima kasih, masalah saya tampaknya saya lupa untuk mendapatkan direktori file xml terlebih dahulu, saya telah mencoba Gabungkan, tetapi dengan jalur absolut file, yang tidak berfungsi. Saya tidak tahu yang mana dari semua jawaban ini yang pertama, waktu menunjukkan hal yang sama, tetapi Anda menunjukkan untuk mendapatkan direktori, jadi saya memilih jawaban Anda. Terima kasih untuk semuanya!
Anders
10
Dengan sedikit eksperimen, tampaknya (new Uri(absolute_path)).LocalPathmelakukan hal yang sama seperti yang Path.GetFullPath(absolute_path)satu atau yang lainnya sudah cukup.
Tim Lewis
1
Perhatikan bahwa Uri memiliki penanganan khusus untuk "#" atau "&" yang tidak Anda inginkan saat menangani jalur dan nama file!
MatsW
1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpath menyatakan Gets a local operating-system representation of a file name.jadi dalam kasus ini, tidak ada penanganan khusus yang diharapkan.
FrankM
144
string exactPath = Path.GetFullPath(yourRelativePath);

bekerja

cahit beyaz
sumber
14
ini jawaban yang benar untuk pertanyaan 'bagaimana Anda mengubah jalur relatif menjadi jalur absolut?' OP hanya ingin mengetahui jawaban untuk 'bagaimana Anda tetap berpegang pada jalur bersama?'
JonnyRaa
2
Awalnya saya pikir ini tidak berhasil, tetapi berhasil. Jika Anda memberi makan jalur relatif Anda C: \ test \ A \ .. \ B \ test.txt Outputnya adalah C: \ test \ B \ test.txt
BraveNewMath
34

Ini berhasil.

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

Ini cara terbaik untuk mengubah jalur Relatif ke jalur absolut!

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

Anda dapat menggunakan Path.Combine dengan jalur "base", lalu GetFullPath pada hasil.

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
sumber
5

Sudahkah Anda mencoba Server.MapPathmetode. Berikut ini contohnya

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
sumber
1

Ini berhasil untuk saya.

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