เส้นทางสัมพัทธ์กับเส้นทางสัมบูรณ์ใน C #?


86

ฉันมีไฟล์ xml ที่มีเส้นทางไฟล์ href ไปยังรูปภาพ (เช่น ".... \ images \ image.jpg") hrefs มีพา ธ สัมพัทธ์ ตอนนี้ฉันต้องแยก hrefs ไปยังรูปภาพและเปลี่ยนเป็นพา ธ สัมบูรณ์ในระบบไฟล์

ฉันรู้เกี่ยวกับเมธอด GetFullPath แต่ฉันลองแล้วและดูเหมือนว่าจะใช้ได้เฉพาะจากชุด CurrentDirectory ซึ่งดูเหมือนจะเป็น C: ดังนั้นฉันจึงไม่เห็นว่าฉันจะใช้มันได้อย่างไร และถึงกระนั้นฉันก็มีเส้นทางสัมบูรณ์ของไฟล์ที่มี hrefs และพา ธ สัมพัทธ์ของ href ดังนั้นฉันจึงนับจำนวนชิ้นส่วน ".... \" ย้อนกลับไปตามเส้นทางสัมบูรณ์ของ ไฟล์ที่มีดูเหมือนว่าจะต้องมีวิธีดำเนินการทางโปรแกรมด้วยเช่นกัน

ฉันหวังว่าจะมีวิธีง่ายๆที่ฉันไม่รู้! ความคิดใด ๆ ?


2
นี่คือแอปพลิเคชันบนเดสก์ท็อปหรือเว็บ
Chris Kooken

คำตอบ:


106

สมมติว่าคุณรู้จักไดเร็กทอรีจริงที่ไฟล์ XML ใช้งานอยู่ Path.Combine เช่น

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

หากคุณต้องการกลับสู่เส้นทางแบบเต็มโดยมีการยุบของ .. คุณสามารถใช้:

Path.GetFullPath((new Uri(absolute_path)).LocalPath);

1
ขอบคุณปัญหาของฉันเห็นได้ชัดว่าฉันลืมรับไดเร็กทอรีของไฟล์ xml ก่อนฉันได้ลอง Combine แต่ด้วยพา ธ สัมบูรณ์ของไฟล์ซึ่งไม่ได้ผล ฉันไม่รู้ว่าคำตอบใดก่อนหน้านี้เวลาแสดงเหมือนกัน แต่คุณชี้ให้รับไดเรกทอรีฉันจึงเลือกคำตอบของคุณ ขอบคุณทุกคน!
Anders

10
ด้วยการทดลองเล็กน้อยดูเหมือนว่า(new Uri(absolute_path)).LocalPathจะทำในสิ่งเดียวกันกับที่Path.GetFullPath(absolute_path)ควรจะพอเพียง
Tim Lewis

1
โปรดทราบว่า Uri มีการจัดการ "#" หรือ "&" แบบพิเศษซึ่งคุณไม่ต้องการเมื่อจัดการเส้นทางและชื่อไฟล์!
MatsW

1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpathระบุGets a local operating-system representation of a file name.ดังนั้นในกรณีนี้จึงไม่คาดว่าจะมีการจัดการพิเศษ
FrankM

144
string exactPath = Path.GetFullPath(yourRelativePath);

ได้ผล


14
นี่คือคำตอบที่ถูกต้องสำหรับคำถาม 'คุณจะแปลงเส้นทางสัมพัทธ์เป็นเส้นทางสัมบูรณ์ได้อย่างไร?' OP แค่อยากรู้คำตอบว่า 'คุณยึดติดกับส่วนต่างๆของเส้นทางด้วยกันได้อย่างไร?'
JonnyRaa

2
ตอนแรกฉันคิดว่ามันไม่ได้ผล แต่มันก็ทำได้ หากคุณป้อนเส้นทางสัมพัทธ์ของ C: \ test \ A \ .. \ B \ test.txt ผลลัพธ์จะเป็น C: \ test \ B \ test.txt
BraveNewMath


9

เป็นวิธีที่ดีที่สุดสำหรับการแปลงเส้นทางสัมพัทธ์เป็นเส้นทางที่แน่นอน!

string absolutePath = System.IO.Path.GetFullPath(relativePath);

6

คุณสามารถใช้ Path.Combine กับพา ธ "base" จากนั้น GetFullPath ในผลลัพธ์

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


1

สิ่งนี้ได้ผลสำหรับฉัน

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.