C#中绝对路径转相对路径

来源:互联网 发布:英克灵智医药软件 编辑:程序博客网 时间:2024/06/09 20:02

在一份代码中看到了一个路径转换的方法,贴出来共享。具体是谁的代码也不知道,如有冒犯请留言。

        /// <summary>        /// 绝对路径转相对路径        /// </summary>        /// <param name="strBasePath">基本路径</param>        /// <param name="strFullPath">绝对路径</param>        /// <returns>strFullPath相对于strBasePath的相对路径</returns>        public static string GetRelativePath(string strBasePath, string strFullPath)        {            if (strBasePath == null)                throw new ArgumentNullException("strBasePath");            if (strFullPath == null)                throw new ArgumentNullException("strFullPath");                        strBasePath = Path.GetFullPath(strBasePath);            strFullPath = Path.GetFullPath(strFullPath);                        var DirectoryPos = new int[strBasePath.Length];            int nPosCount = 0;                        DirectoryPos[nPosCount] = -1;            ++nPosCount;                        int nDirectoryPos = 0;            while (true)            {                nDirectoryPos = strBasePath.IndexOf('\\', nDirectoryPos);                if (nDirectoryPos == -1)                    break;                                DirectoryPos[nPosCount] = nDirectoryPos;                ++nPosCount;                ++nDirectoryPos;            }                        if (!strBasePath.EndsWith("\\"))            {                DirectoryPos[nPosCount] = strBasePath.Length;                ++nPosCount;            }                             int nCommon = -1;            for (int i = 1; i < nPosCount; ++i)            {                int nStart = DirectoryPos[i - 1] + 1;                int nLength = DirectoryPos[i] - nStart;                                if (string.Compare(strBasePath, nStart, strFullPath, nStart, nLength, true) != 0)                    break;                                nCommon = i;            }                        if (nCommon == -1)                return strFullPath;                        var strBuilder = new StringBuilder();            for (int i = nCommon + 1; i < nPosCount; ++i)                strBuilder.Append("..\\");                        int nSubStartPos = DirectoryPos[nCommon] + 1;            if (nSubStartPos < strFullPath.Length)                strBuilder.Append(strFullPath.Substring(nSubStartPos));                        string strResult = strBuilder.ToString();            return strResult == string.Empty ? ".\\" : strResult;        }

用法:

using System;using System.Text;using System.IO;namespace PathDemo{class MainClass{public static void Main (string[] args){string str = GetRelativePath ("/Users/apple/Documents/TempDemo/PathDemo", "/Users/apple/Documents/TempDemo/PathDemo/PathDemo/Main.cs");Console.WriteLine ("********");Console.WriteLine (str);Console.WriteLine ("********");}public static string GetRelativePath(string strBasePath, string strFullPath){if (strBasePath == null)throw new ArgumentNullException("strBasePath");if (strFullPath == null)throw new ArgumentNullException("strFullPath");strBasePath = Path.GetFullPath(strBasePath);strFullPath = Path.GetFullPath(strFullPath);var DirectoryPos = new int[strBasePath.Length];int nPosCount = 0;DirectoryPos[nPosCount] = -1;++nPosCount;int nDirectoryPos = 0;while (true){nDirectoryPos = strBasePath.IndexOf('\\', nDirectoryPos);if (nDirectoryPos == -1)break;DirectoryPos[nPosCount] = nDirectoryPos;++nPosCount;++nDirectoryPos;}if (!strBasePath.EndsWith("\\")){DirectoryPos[nPosCount] = strBasePath.Length;++nPosCount;}     int nCommon = -1;for (int i = 1; i < nPosCount; ++i){int nStart = DirectoryPos[i - 1] + 1;int nLength = DirectoryPos[i] - nStart;if (string.Compare(strBasePath, nStart, strFullPath, nStart, nLength, true) != 0)break;nCommon = i;}if (nCommon == -1)return strFullPath;var strBuilder = new StringBuilder();for (int i = nCommon + 1; i < nPosCount; ++i)strBuilder.Append("..\\");int nSubStartPos = DirectoryPos[nCommon] + 1;if (nSubStartPos < strFullPath.Length)strBuilder.Append(strFullPath.Substring(nSubStartPos));string strResult = strBuilder.ToString();return strResult == string.Empty ? ".\\" : strResult;}}}


0 0