绝对路径转换为相对路径

最近写了个工作上要用到的工具,要和同事共用,需要储存各种文件路径,为了保证我们的文件结构相同,且减少文件错乱的问题,在储存文件路径的时候决定用相对路径来实现,就像VS里生成路径一样,随便把项目考到哪个地方都能保持正常运行。

但是网上一搜,悲催了,找了半天没有好到这方面的参考代码或思路什么的,所以自己想了一个傻瓜办法。

算法思路就是:举个列子,比如有参考路径:F:\\A\B\C\D\E

需要转换为相对路径的源路径:F:\\A\B\C-1\C-2\C-3\C-4

先找到两个路径共同的父路径strParent = F:\\A\B,然后把参考路径除了父路径外路径C\D\E转换为相对路径strRelative = ..\..\..\

然后把源路径的strParent替换为strRelative就可以了,很简单吧


下面是源码

        /// 
        /// 绝对路径转换为相对路径
        /// 
        /// 参考路径
        /// 需要转换的路径
        /// 返回转换后的路径
        private string ChangeToRelativePath(string strReferencePath, string strSourcePath)
        {
            string strReferencePathRoot = Path.GetPathRoot(strReferencePath);
            string strSourcePathRoot = Path.GetPathRoot(strSourcePath);

            //不同盘符则不转换
            if (strReferencePathRoot != strSourcePathRoot)
                return strSourcePath;

            //先清除末尾的‘\\’
            strReferencePath = strReferencePath.TrimEnd('\\');
            strSourcePath = strSourcePath.TrimEnd('\\');

            string[] arrLocationDirSegment = strReferencePath.Split('\\');
            string[] arrSourceDirSegment = strSourcePath.Split('\\');

            if (arrLocationDirSegment.Length == 0 || arrSourceDirSegment.Length == 0)
                return strSourcePath;

            //参考路径和要转换的路径共同的父路径
            string strSamePath = strReferencePathRoot;

            //参考到父路径的相对路径
            string strLocationRelativePath = string.Empty;

            //以参考路径分段长度作为循环
            for (int i = 1; i < arrLocationDirSegment.Length; i++)
            {
                if (i < arrSourceDirSegment.Length)
                {
                    if (arrLocationDirSegment[i] == arrSourceDirSegment[i]) //若相同则为父路径
                        strSamePath += arrLocationDirSegment[i] + "\\";
                    else //若不同则为当前程序自己的路径,此路径就需要转换为相对路径
                        strLocationRelativePath += "..\\";
                }
                else//若需要转换的路径长度小于当前程序路径,此路径就需要转换为相对路径
                    strLocationRelativePath += "..\\";
            }

            return strSourcePath.Replace(strSamePath, strLocationRelativePath);
        }
小弟第一次写博客,有点小兴奋呢,如果大家有更好的想法可以提出来,大家互相交流学习

你可能感兴趣的:(绝对路径转换为相对路径)