GetShortPathName() return 在输入特定路径时出现乱码

GetShortPathName() return garbled when feeding particular path

我们的团队多年来一直使用以下代码

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern Int32 GetShortPathName(string path, StringBuilder shortPath, int shortPathLength);

public static string GetShortPathName(string longPath)
{
    StringBuilder shortPath = new StringBuilder(longPath.Length + 1);

    if (0 == GetShortPathName(longPath, shortPath, shortPath.Capacity))
    {
        return longPath;
    }

    return shortPath.ToString();
}

上周某个时候我们收到一份报告,说我们的应用程序停止工作。排除故障后我们发现在向 GetShortPathName() 提供以下路径时,它的 returns 路径里面有乱码。

\?\C:\Disks\WDT.6.5\winpex32.wim

所以我试图找到模式,但找不到任何...

var r1 = GetShortPathName(@"\?\C:\Disks\WDT.6.5\winpex32.wim"); // r1 = \?\C:\Disks\WDT6~1.5䳸ĴDšóó%
var r2 = GetShortPathName(@"\?\C:\Disks\WDT\test\winpex32.wim");   // r2 = \?\C:\Disks\WDT\test\winpex32.wim
var r3 = GetShortPathName(@"\?\C:\Disks\WDT.2.3\winpex32.wim");  // r3 = \?\C:\Disks\WDT.2.3\winpex32.wim
var r4 = GetShortPathName(@"\?\C:\Disks\WDT.6.5\winpex32.wim"); // r4 = \?\C:\Disks\WDT.6.5\winpex32.wim
var r5 = GetShortPathName(@"\?\C:\Disks\WDT.6.6\winpex32.wim"); // r5 = \?\C:\Disks\WDT.6.6\winpex32.wim
var r6 = GetShortPathName(@"\?\C:\Disks\WDT.6.4\winpex32.wim"); // r6 = \?\C:\Disks\WDT.6.4\winpex32.wim
var r7 = GetShortPathName(@"\?\C:\Disks\WDT[=13=].6.5\winpex32.wim");  // r7 = \?\C:\Disks\WDT[=13=].6.5\winpex32.wim
var r8 = GetShortPathName(@"\?\C:\X\WDT.6.5\winpex32.wim");     // r8 = \?\C:\X\WDT.6.5\winpex32.wim
var r9 = GetShortPathName(@"\?\C:\Disks\T.6.5\winpex32.wim");   // r9 = \?\C:\Disks\T.6.5\winpex32.wim
var r10 = GetShortPathName(@"\?\C:\Disks\WDT.6.5\wx.wim");      // r10 = \?\C:\Disks\WDT.6.5\wx.wim

除了 r1 之外其他的都工作正常,我 运行 没有想法。

在这种特殊情况下是什么原因导致出现乱码,我该怎么做才能防止出现这种情况?

于是我发现每次乱码都略有不同
这让我想知道 GetShortPathName() 是否无法将结果正确存储到 StringBuilder,是的,我没有提供足够的 space 到 StringBuilder,这导致所有这些混乱。

一旦我添加了足够的容量

StringBuilder shortPath = new StringBuilder(260);

我可以找回路径不乱码

\?\C:\Disks\WDT6~1.5\winpex32.wim