2010年11月10日 星期三

C# 絕對路徑轉相對路徑

程式碼轉載自 Deep Brain Studio



private string RelativePath(string absolutePath, string relativeTo)
{
    string[] absoluteDirectories = absolutePath.Split('\\');
    string[] relativeDirectories = relativeTo.Split('\\');//Get the shortest of the two paths 
    int length = absoluteDirectories.Length < relativeDirectories.Length ? absoluteDirectories.Length : relativeDirectories.Length;//Use to determine where in the loop we exited 
    int lastCommonRoot = -1;
    int index; //Find common root 
    for (index = 0; index < length; index++)
        if (absoluteDirectories[index] == relativeDirectories[index])
            lastCommonRoot = index;
        else
            break;//If we didn't find a common prefix then throw 
    if (lastCommonRoot == -1)
        throw new ArgumentException("Paths do not have a common base");//Build up the relative path 
    StringBuilder relativePath = new StringBuilder(); //Add on the .. 
    for (index = lastCommonRoot + 1; index < absoluteDirectories.Length; index++)
        if (absoluteDirectories[index].Length > 0)
            relativePath.Append("..\\"); //Add on the folders 
    for (index = lastCommonRoot + 1; index < relativeDirectories.Length - 1; index++)
        relativePath.Append(relativeDirectories[index] + "\\");
    relativePath.Append(relativeDirectories[relativeDirectories.Length - 1]);
    return relativePath.ToString();
}

不過遇到不同磁碟時就會 throw exception~最好是可以事先作別的處理避免這個問題。

沒有留言: