web-dev-qa-db-ja.com

Path。絶対パスと相対パス文字列の組み合わせ

_Path.Combine_ を使用して、Windowsパスを相対パスに結合しようとしています。

ただし、Path.Combine(@"C:\blah",@"..\bling")は_C:\blah\..\bling_ではなく_C:\bling\_を返します。

私の相対パスリゾルバを書くことなくこれを達成する方法を誰もが知っていますか(これは難しくないはずです)?

83
CVertex

機能:

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

(結果:absolutePath = "C:\ bling.txt")

機能しないもの

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

(結果:absolutePath = "C:/blah/bling.txt")

58
Llyle

結合されたパスでPath.GetFullPathを呼び出します http://msdn.Microsoft.com/en-us/library/system.io.path.getfullpath.aspx

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

(Path.Combineはこれを単独で行う必要があることに同意します)

29
Colonel Panic

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

これにより、必要なものが正確に得られます(これが機能するためにパスが存在する必要はありません)

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

Windowsユニバーサルアプリの場合、Path.GetFullPath()は使用できません。System.Uriクラス代わりに:

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