c#实现绝对路径和相对路径的转换

有时候需要实现绝对路径和相对路径的转换,其实在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"这样的结果,可以存储到配置文件中,在使用时如果需要可以转成绝对路径。

相关推荐
Hilaku33 分钟前
我用 Gemini 3 Pro 手搓了一个并发邮件群发神器(附源码)
前端·javascript·github
IT_陈寒33 分钟前
Java性能调优实战:5个被低估却提升30%效率的JVM参数
前端·人工智能·后端
快手技术35 分钟前
AAAI 2026|全面发力!快手斩获 3 篇 Oral,12 篇论文入选!
前端·后端·算法
颜酱36 分钟前
前端算法必备:滑动窗口从入门到很熟练(最长/最短/计数三大类型)
前端·后端·算法
用户2986985301439 分钟前
C#: 如何自动化创建Word可填写表单,告别手动填写时代
后端·c#·.net
全栈前端老曹44 分钟前
【包管理】npm init 项目名后底层发生了什么的完整逻辑
前端·javascript·npm·node.js·json·包管理·底层原理
HHHHHY1 小时前
mathjs简单实现一个数学计算公式及校验组件
前端·javascript·vue.js
boooooooom1 小时前
Vue3 provide/inject 跨层级通信:最佳实践与避坑指南
前端·vue.js
一颗烂土豆1 小时前
Vue 3 + Three.js 打造轻量级 3D 图表库 —— chart3
前端·vue.js·数据可视化
青莲8431 小时前
Android 动画机制完整详解
android·前端·面试