在.net中转换为短路径的标准方法
正在寻找标准的防bug方法,将“长名称”(如“C:\Documents and settings”)转换为等效的“短名称”(C:\DOCUME~1)在.net中转换为短路径的标准方法,.net,path,quotes,.net,Path,Quotes,正在寻找标准的防bug方法,将“长名称”(如“C:\Documents and settings”)转换为等效的“短名称”(C:\DOCUME~1) 我需要这个来运行我的C#应用程序的外部进程。如果我在“long name”中为它提供路径,它将失败。如果您准备开始调用Windows API函数,那么GetShortPathName()和GetLongPathName()将提供此功能 看 即使将长文件路径括在引号中,外部进程是否也会失败?如果外部应用程序支持,这可能是一种更简单的方法 e、 g 使
我需要这个来运行我的C#应用程序的外部进程。如果我在“long name”中为它提供路径,它将失败。如果您准备开始调用Windows API函数,那么GetShortPathName()和GetLongPathName()将提供此功能 看
即使将长文件路径括在引号中,外部进程是否也会失败?如果外部应用程序支持,这可能是一种更简单的方法 e、 g
使用WinAPI中的GetShortPathName的技巧可以很好地工作,但是在那里使用很长的路径时要小心
我们只是在调用7zip时遇到了一个问题,路径比MAX_PATH长。如果路径太长,则GetShortPathName不起作用。只需在它前面加上“\?\”前缀,它就能完成任务并返回正确的缩短路径。它可以工作。你有任何解释或文件来解释发生了什么吗?没有。如果字符串用引号分隔,现代应用程序接受带空格的参数只是(合理地)标准行为……您需要引号,因为路径基本上是一个命令行选项,空格是命令行选项的分隔符。如果使用带有空格的路径,则命令行将被解析为多个选项。定义:“空格”-ASCII字符通常被误认为是缺少字符+1 im,只是集成了一个只适用于短路径的exe(由于内部错误),这似乎失败了(不返回任何内容)如果传递的路径大于
MAX\u path
,则需要缩短。我认为字符串应编组为LPWStr
,而不是LPTStr
。仅供参考,“短路径”指的是“8.3名称”
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"