在.NET中将路径转换为短路径的标准方法

9

寻找标准的无漏洞方法,将“长名称”(如“C:\ Documents and settings”)转换为它们对应的“短名称”“C:\ DOCUME〜1”。

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


只是提供信息,我相信“短路径”是指“8.3 文件名”。 - user17753
3个回答

23

如果您准备开始调用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();
    }

1
+1 我只是在集成一个仅支持短路径(由于内部错误)的exe。 - Sam Saffron
3
如果您传递一个大于MAX_PATH的路径进行缩短,这似乎会失败(返回空)。 - user17753
我认为字符串应该作为“LPWStr”而不是“LPTStr”进行编组。 - unknown6656
无论是 LPWStr 还是 LPTStr,该方法只会为我返回原始(长)文件名。 - mcmillab

4
使用WinAPI中的GetShortPathName技巧很好用,但在使用非常长的路径时要小心。我们刚刚遇到了一个问题,当调用7zip处理超过MAX_PATH的路径时,GetShortPathName对于过长的路径无效。只需在其前面加上“\?\”,然后它将完成任务并返回正确缩短的路径。

4

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

例如:

myExternalApp "C:\Documents And Settings\myUser\SomeData.file"

它可以工作。你有任何解释或文档来解释发生了什么吗? - Hanan
不一定。如果字符串用引号括起来,现代应用程序接受带空格的参数是(相对)标准行为... - ZombieSheep
2
你需要加引号,因为路径基本上是一个命令行选项,而空格是命令行选项的分隔符。如果你使用带有空格的路径,则命令行将被解析为多个选项。定义:“Space” - ASCII字符常被误认为是缺少字符。 - Tim Long

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接