假设我有两个路径字符串,一个是绝对路径字符串,例如@"C:\abc\xyz"
,以及一个相关的,例如@"..\def"
。我如何可靠地将它们组合起来以产生最小形式@"C:\abc\def"
?
由于该过程应该适用于 .NET 的 I/O API 支持的任何形式的路径(即 .NET 或 Mono 当前运行的系统的本机路径,或者类似 UNC 路径等),因此手动字符串操作似乎是一个太不可靠的解决方案。
一般来说,组合路径字符串的简洁方法是使用Path.Combine method https://msdn.microsoft.com/en-us/library/system.io.path.combine(v=vs.110).aspx:
Path.Combine(@"C:\abc\xyz", @"..\def")
不幸的是,它并没有最小化路径和返回C:\abc\xyz\..\def
.
正如其他几个问题中所建议的(例如this https://stackoverflow.com/questions/38773107/get-absolute-path-from-relative-path-c-sharp, or this https://stackoverflow.com/questions/42728678/convert-relative-path-to-absolute-path), the GetFullPath method https://msdn.microsoft.com/en-us/library/system.io.path.getfullpath(v=vs.110).aspx应该应用于结果:
Path.GetFullPath(Path.Combine(@"C:\abc\xyz", @"..\def"))
问题在于GetFullPath
实际上查看文件系统而不仅仅是处理路径字符串。来自docs https://msdn.microsoft.com/en-us/library/system.io.path.getfullpath(v=vs.110).aspx:
由指定的文件或目录path不需要存在。 (...)但是,如果path确实存在,调用者必须有权限获取路径信息path。请注意,与 Path 类的大多数成员不同,此方法访问文件系统。
所以,GetFullPath
如果我只想最小化任意路径字符串,则不起作用:根据运行应用程序的系统上是否存在该路径,该方法可能会失败并显示SecurityException
如果用户无权访问该路径。
那么,如何可靠地组合可以处理的路径字符串System.IO
返回最短可能绝对路径的方法?