Đường dẫn tương đối đến đường dẫn tuyệt đối trong C #?


86

Tôi có tệp xml chứa đường dẫn tệp href đến hình ảnh (ví dụ: ".... \ images \ image.jpg"). Các hrefs chứa các đường dẫn tương đối. Bây giờ, tôi cần giải nén các hrefs vào các hình ảnh và biến chúng thành các đường dẫn tuyệt đối trong hệ thống tệp.

Tôi biết về phương thức GetFullPath, nhưng tôi đã thử nó và nó dường như chỉ hoạt động từ tập CurrentDirectory, có vẻ như là C: vì vậy tôi không biết mình có thể sử dụng nó như thế nào. Và tôi vẫn có đường dẫn tuyệt đối của tệp chứa hrefs và các đường dẫn tương đối href, vì vậy, tôi thực hiện nhiệm vụ đơn giản là đếm lại số phần ".... \" dựa trên đường dẫn tuyệt đối của tệp chứa, có vẻ như cũng phải có một cách để thực hiện việc này theo chương trình.

Tôi hy vọng có một số phương pháp đơn giản mà tôi không biết! Có ý kiến ​​gì không?


2
Đây là ứng dụng dành cho máy tính để bàn hay web?
Chris Kooken

Câu trả lời:


104

Giả sử bạn biết thư mục thực mà tệp XML đang sử dụng Path.Combine, ví dụ:

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

Nếu bạn muốn lấy lại đường dẫn đầy đủ với bất kỳ .. nào được thu gọn thì bạn có thể sử dụng:

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

1
Cảm ơn, vấn đề của tôi rõ ràng là tôi đã quên lấy thư mục của tệp xml trước, tôi đã thử Kết hợp, nhưng với đường dẫn tuyệt đối của tệp, điều này không hoạt động. Tôi không biết câu trả lời nào trong số tất cả những câu trả lời này là đầu tiên, thời gian hiển thị như nhau, nhưng bạn đã chỉ ra để lấy danh bạ, vì vậy tôi đã chọn câu trả lời của bạn. Cảm ơn tất cả mặc dù!
Anders

10
Với một chút thử nghiệm, nó dường như (new Uri(absolute_path)).LocalPathlàm điều tương tự như Path.GetFullPath(absolute_path)cái này hay cái kia là đủ.
Tim Lewis

1
Lưu ý rằng Uri có cách xử lý đặc biệt đối với "#" hoặc "&" mà bạn không muốn khi xử lý đường dẫn và tên tệp!
MatsW

1
@MatsW: docs.microsoft.com/en-us/dotnet/api/system.uri.localpath nói rằng Gets a local operating-system representation of a file name.trong trường hợp này, không có xử lý đặc biệt nào được mong đợi.
FrankM

142
string exactPath = Path.GetFullPath(yourRelativePath);

làm


14
đây là câu trả lời đúng cho câu hỏi 'làm cách nào để bạn chuyển đổi một đường dẫn tương đối thành đường dẫn tuyệt đối?' OP chỉ muốn biết câu trả lời cho câu hỏi 'làm thế nào để bạn gắn kết các con đường lại với nhau?'
JonnyRaa

2
Lúc đầu, tôi nghĩ điều này không hiệu quả, nhưng nó có. Nếu bạn cung cấp đường dẫn tương đối của C: \ test \ A \ .. \ B \ test.txt Đầu ra sẽ là C: \ test \ B \ test.txt
BraveNewMath

34

Điều này đã hiệu quả.

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

9

Đó là cách tốt nhất để chuyển đổi đường dẫn Tương đối thành đường dẫn tuyệt đối!

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

6

Bạn có thể sử dụng Path.Combine với đường dẫn "cơ sở", sau đó GetFullPath trên kết quả.

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

5

Bạn đã thử Server.MapPathphương pháp. Đây là một ví dụ

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

1

Điều này đã làm việc cho tôi.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.