有时候需要实现绝对路径和相对路径的转换,其实在c#高一点的版本中已经实现了此功能的封装,但是在版本比较低的时候,比如.net4.6.1,则需要手动实现其中的一些逻辑。

下面这里提供了代码,其中获取相对路径实现了一个重载函数,一个是获取当前路径下的某绝对路径的相对路径,一个是获取某个路径下某绝对路径的相对路径。
代码经过验证可用。
cs
/// <summary>
/// 将相对路径转换为绝对路径
/// </summary>
/// <param name="basePath">当前路径</param>
/// <param name="relativePath">相对路径</param>
/// <returns>绝对路径</returns>
public static string GetAbsolutePath(string basePath, string relativePath)
{
// 合并路径并标准化
string combinedPath = Path.Combine(basePath, relativePath);
return Path.GetFullPath(combinedPath);
}
/// <summary>
/// 获取相对路径或者绝对路径
/// </summary>
/// <param name="path"></param>
/// <param name="bRelative"></param>
/// <returns></returns>
public static string GetRelativePath(string path, bool bRelative)
{
if (string.IsNullOrEmpty(path))
return path;
try
{
if (bRelative)
{
// 当要求返回相对路径时
if (!Path.IsPathRooted(path))
return path; // 已经是相对路径直接返回
string currentDir = Directory.GetCurrentDirectory();
return GetRelativePath(currentDir, path);
}
else
{
// 当要求返回绝对路径时
if (Path.IsPathRooted(path))
return path; // 已经是绝对路径直接返回
string currentDir = Directory.GetCurrentDirectory();
return Path.GetFullPath(Path.Combine(currentDir, path));
}
}
catch (Exception)
{
return path; // 发生异常时返回原路径
}
}
/// <summary>
/// 返回相对路径
/// </summary>
/// <param name="basePath"></param>
/// <param name="targetPath"></param>
/// <returns></returns>
public static string GetRelativePath(string basePath, string targetPath)
{
// 统一路径分隔符
basePath = basePath.Replace('/', '\\');
targetPath = targetPath.Replace('/', '\\');
string[] baseParts = basePath.Split('\\');
string[] targetParts = targetPath.Split('\\');
int commonRoot = -1;
int minLength = Math.Min(baseParts.Length, targetParts.Length);
// 查找共同根目录
for (int i = 0; i < minLength; i++)
{
if (string.Equals(baseParts[i], targetParts[i], StringComparison.OrdinalIgnoreCase))
commonRoot = i;
else
break;
}
if (commonRoot == -1)
return targetPath; // 没有共同根目录,返回完整路径
// 构建相对路径
var relativePath = new System.Text.StringBuilder();
// 添加返回上级目录部分
for (int i = commonRoot + 1; i < baseParts.Length; i++)
{
if (baseParts[i].Length > 0)
relativePath.Append("..\\");
}
// 添加目标路径剩余部分
for (int i = commonRoot + 1; i < targetParts.Length; i++)
{
relativePath.Append(targetParts[i]);
if (i < targetParts.Length - 1)
relativePath.Append('\\');
}
return relativePath.ToString();
}
至此,可以得到类似于 "..\\config\\file.txt"这样的结果,可以存储到配置文件中,在使用时如果需要可以转成绝对路径。