为什么"测试user-doc.doc"==> TESTUS~1.DOC?

Sta*_*wan 1 c# file double-click

我写了一个ac#program,并将它与文件扩展名相关联,就像DOC没有安装MS-Office的PC 一样.然后,我双击任何名称包含空白字符的文件,我的程序将启动以打开该文件.我用下面的声明:

string[] args = Environment.GetCommandLineArgs();
Run Code Online (Sandbox Code Playgroud)

然后args[1]将包含该文件的完整路径文件名.然后,我可以打开它.但现在的问题是,如果文件名包含空白字符,则args[1]包含的文件名与实际文件名不同.作为标题,如果我的文件在e:\tmp3,文件名是test uesr=doc.doc,我期望args[1]包含

"e:\tmp3\test user-doc.doc",
Run Code Online (Sandbox Code Playgroud)

但它实际上包含

"E:\tmp3\TESTUS~1.DOC"
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么以及如何解决它?谢谢.

Dav*_*wen 5

如前所述,这些是8.3文件名.如果您需要从短名称转换为全名,那么您可以使用C#轻松完成此操作.

new FileInfo("E:\tmp3\TESTUS~1.DOC").FullName
Run Code Online (Sandbox Code Playgroud)

走另一条路需要PInvoke调用GetShortPathName.请注意,这不适用于所有NTFS卷,因为可以关闭短名称,但默认情况下,它们会在操作系统所在的卷上打开.

class Program
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern int GetShortPathName(String pathName, StringBuilder shortName, int cbShortName);

    static void Main(string[] args)
    {
        var fullname = args[0];
        var shortPathBuilder = new StringBuilder(fullname.Length);
        GetShortPathName(fullname, shortPathBuilder, shortPathBuilder.Length);
        var shortname = shortPathBuilder.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)