8

寻找标准的防错误方法将“长名称”(例如“C:\Documents and settings”)转换为等效的“短名称”“C:\DOCUME~1”

我需要这个来运行我的 C# 应用程序的外部进程。如果我用“长名称”中的路径提供它,它会失败。

4

3 回答 3

22

如果您准备开始调用 Windows API 函数,则 GetShortPathName() 和 GetLongPathName() 提供此功能。

http://csharparticles.blogspot.com/2005/07/long-and-short-file-name-conversion-in.html

    const int MAX_PATH = 255;

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern int GetShortPathName(
        [MarshalAs(UnmanagedType.LPTStr)]
         string path,
        [MarshalAs(UnmanagedType.LPTStr)]
         StringBuilder shortPath,
        int shortPathLength
        );

    private static string GetShortPath(string path) {
        var shortPath = new StringBuilder(MAX_PATH);
        GetShortPathName(path, shortPath, MAX_PATH);
        return shortPath.ToString();
    }
于 2008-11-03T11:29:24.373 回答
4

即使您将长文件路径括在引号中,外部进程是否也会失败?如果外部应用程序支持,这可能是一种更简单的方法。

例如

myExternalApp "C:\Documents And Settings\myUser\SomeData.file"
于 2008-11-03T12:03:26.037 回答
3

使用 WinAPI 中的 GetShortPathName 的技巧可以正常工作,但在使用非常长的路径时要小心。

我们只是在调用路径长于 MAX_PATH 的 7zip 时遇到了问题。如果路径太长,GetShortPathName 不起作用。只需在它前面加上“\?\”,然后它就会完成这项工作并正确返回缩短的路径。

于 2013-09-26T13:17:48.903 回答