Câu hỏi Path.Combine tuyệt đối với các chuỗi đường dẫn tương đối


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

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

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


76
2018-03-22 04:50


gốc


Bản sao: stackoverflow.com/questions/623333/… - Greg Dean
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
đó là bản sao, mặc dù tôi nghĩ Path.GetFullName là một giải pháp tốt hơn. - Greg Dean
Bạn chỉ mâu thuẫn với chính mình. Nhưng cảm ơn câu trả lời thay thế. - CVertex
có thể trùng lặp Path.Combine và ký hiệu chấm - Julien Bérubé


Các câu trả lời:


Tác phẩm:

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

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

Những 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")


54
2017-08-19 11:33



Bạn nên sử dụng lớp Path, chứ không phải Url ... - Frank Schwieterman
Vâng, đó là những gì tôi đang xúi giục với bài đăng - Llyle
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 hiệu quả. Trong trường hợp đó, bạn có thể thêm chúng vào chuỗi hoặc làm theo cách thủ công Path.GetFullPath(Path.Combine(baseDirectory, relativePath)) - Nelson Rothermel
Không phải kết quả của bạn Tác phẩm phần được C:\bling.txt? - cod3monk3y
Tại sao phương pháp dựa trên URI không hoạt động? Theo câu trả lời này, kết quả là hợp lệ (và nó dường như cũng được công nhận trên Windows). - F-H


Gọi Path.GetFullPath trên đường dẫn kết hợp http://msdn.microsoft.com/en-us/library/system.io.path.getfullpath.aspx

> Path.GetFullPath(Path.Combine(@"C:\blah\",@"..\bling"))
C:\bling

(Tôi đồng ý Path.Combine nên làm điều này một mình)


22
2018-05-20 09:44






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


14
2018-03-22 05:09



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


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

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

3
2017-07-17 10:31



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) - Paul Williams


Dành cho các ứng dụng phổ dụng trên windows Path.GetFullPath() không có sẵn, bạn có thể sử dụng System.Uri thay vào đó:

 Uri uri = new Uri(Path.Combine(@"C:\blah\",@"..\bling"));
 Console.WriteLine(uri.LocalPath);

2
2018-05-31 20:13