寻找标准的防错误方法将“长名称”(例如“C:\Documents and settings”)转换为等效的“短名称”“C:\DOCUME~1”
我需要这个来运行我的 C# 应用程序的外部进程。如果我用“长名称”中的路径提供它,它会失败。
如果您准备开始调用 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();
}
即使您将长文件路径括在引号中,外部进程是否也会失败?如果外部应用程序支持,这可能是一种更简单的方法。
例如
myExternalApp "C:\Documents And Settings\myUser\SomeData.file"
使用 WinAPI 中的 GetShortPathName 的技巧可以正常工作,但在使用非常长的路径时要小心。
我们只是在调用路径长于 MAX_PATH 的 7zip 时遇到了问题。如果路径太长,GetShortPathName 不起作用。只需在它前面加上“\?\”,然后它就会完成这项工作并正确返回缩短的路径。