我正在尝试获取包含宽字符的路径的短路径名称,这是我正在使用的代码,它始终为未找到的文件抛出异常。该文件肯定存在,我做错了什么?
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;
namespace GetShortPathNameW_Test
{
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
private static extern int GetShortPathNameW(String pathName, System.Text.StringBuilder shortName, int cbShortName);
static void Main(string[] args)
{
System.Text.StringBuilder new_path = new System.Text.StringBuilder(1500);
int n = GetShortPathNameW("\\\\?\\C:\\\\temp\\test1.txt", new_path, 1024);
if (n == 0)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
}
}
答案 0 :(得分:2)
您显式调用Unicode版本GetShortPathNameW
,但未指定用于调用Unicode版本的正确参数。
首先,将方法重命名为GetShortPathName
。这足以让它开始工作,没有任何其他变化。您的参数仍然是“ANSI”字符串,但这没关系,因为您正在调用“ANSI”实现。
其次,您可以将CharSet = CharSet.Unicode
添加到DllImport
属性中,以指定您想要Unicode实现。这也确保字符串作为Unicode字符串传递。这也将使一切按预期工作。
现在,没有理由不调用函数的Unicode实现,但DllImport
的默认值不能在不破坏向后兼容性的情况下改变,因此需要为每个函数指定它。