2009-03-22 44 views
73

Tôi đang cố gắng tham gia một đường dẫn Windows với đường dẫn tương đối bằng cách sử dụng Path.Combine.Đường dẫn. Hoàn toàn tuyệt đối với các đường dẫn tương đối

Tuy nhiên, Path.Combine(@"C:\blah",@"..\bling") trả về C:\blah\..\bling thay vì C:\bling\.

Có ai biết cách thực hiện điều này mà không cần viết trình phân giải đường dẫn tương đối của riêng tôi (không nên quá khó)?

+1

trùng lặp: http://stackoverflow.com/questions/623333/pathcanonicalize-equivalent-in-c –

+5

Chúng tôi đang nhận được câu trả lời khác nhau ở đây .. Tôi không nghĩ rằng đó là một bản sao – CVertex

+0

đó là trùng lặp, mặc dù tôi nghĩ Path.GetFullName là một giải pháp tốt hơn. –

Trả lời

14
 

Path.GetFullPath(@"c:\windows\temp\..\system32")? 
 
+1

Lưu ý: nên dẫn đến 'c: \ windows \ system32' – cod3monk3y

50

gì Works:

string relativePath = "..\\bling.txt"; 
string baseDirectory = "C:\\blah\\"; 
string absolutePath = Path.GetFullPath(baseDirectory + relativePath); 

(kết quả: absolutePath = "C: \ bling.txt")

gì không hoạt động

string relativePath = "..\\bling.txt"; 
Uri baseAbsoluteUri = new Uri("C:\\blah\\"); 
string absolutePath = new Uri(baseAbsoluteUri, relativePath).AbsolutePath; 

(kết quả: absolutePath = "C: /blah/bling.txt")

+0

Bạn nên sử dụng lớp Đường dẫn, chứ không phải là Url ... –

+8

Có, đó là điều tôi đang làm nổi bật với bài đăng – Llyle

+7

Chỉ cần đảm bảo baseDirectory có dấu \, nếu không bạn kết thúc bằng 'C: \\ blah .. \\ bling.txt' và điều đó không hoạt động. Trong trường hợp đó bạn có thể tự thêm chúng vào chuỗi hoặc làm 'Path.GetFullPath (Path.Combine (baseDirectory, relativePath))' –

3

Điều này sẽ cho bạn biết chính xác những gì bạn cần (đường dẫn KHÔNG có tồn tại để làm việc này)

DirectoryInfo di = new DirectoryInfo(@"C:\blah\..\bling"); 
string cleanPath = di.FullName; 
+1

Cả Path.GetFullPath() và DirectoryInfo.FullName sẽ hoạt động trên một đường dẫn hư cấu. Vấn đề là khi tệp thực sự tồn tại, quá trình thực thi cần FileIOPermission - đúng cho cả hai API. (xem MSDN) –

2

đối với các cửa sổ ứng dụng phổ Path.GetFullPath() không có sẵn, bạn có thể sử dụng lớp System.Uri thay vì:

Uri uri = new Uri(Path.Combine(@"C:\blah\",@"..\bling")); 
Console.WriteLine(uri.LocalPath); 
Các vấn đề liên quan