PathRelativePathTo正在将unicode charactrs转换为ascii

时间:2017-07-19 10:15:33

标签: c# unicode

我有以下功能:

    public static string GetRelativePath(string fromPath, string toPath)
    {
        // we also tried the Uri solution but that does not return .. when you need to traverse
        // one up only
        // uri1 = "bla\foo"
        // uri2 = "bla\bar"
        // uri1.MakeRelaitveto(uri2) != "..\bar"
        var path = new StringBuilder(260); // MAX_PATH
        if (PathRelativePathTo(
            path,
            fromPath.Replace('/', '\\'),
            FILE_ATTRIBUTE_DIRECTORY,
            toPath.Replace('/', '\\'),
            FILE_ATTRIBUTE_DIRECTORY) == 0)
        {
            return toPath;
        }

        return path.ToString().Replace('\\', Path.DirectorySeparatorChar);
    }

    [DllImport("shlwapi.dll", SetLastError = true)]
    private static extern int PathRelativePathTo(
        StringBuilder pszPath, string pszFrom, int dwAttrFrom, string pszTo, int dwAttrTo);
}

我使用以下测试用语调用:

GetPathRelativeTo("C:\\somεpath", "C:\\anothεrpath").Shouldbe("..\\anothεrpath")

但它正在返回..\\anotherpath。请注意,ε已替换为e

我尝试使用PathRelativePathToW,但效果更差(其他测试用例失败)。

有人知道发生了什么以及如何阻止更换char吗?

1 个答案:

答案 0 :(得分:0)

这似乎是shlwapi的问题,而不是C#方面的任何问题。

请考虑使用System.Uri

How do I get a relative path from one path to another in C#