在一份代码中看到了一个路径转换的方法,贴出来共享。具体是谁的代码也不知道,如有冒犯请留言。
/// <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;
}
}
}