为什么“测试用户doc.doc” ==> TESTUS〜1.DOC?(Why “test us

2019-09-30 07:26发布

我写了一个C#程序和我一起文件扩展名等相关的它DOC在PC没有安装微软Office。 然后,我双击其名称中包含空格字符的任何文件,我的程序将启动,以打开该文件。 我用下面的语句:

string[] args = Environment.GetCommandLineArgs();

然后args[1]将包含文件的完整路径文件名。 然后,我就可以打开它。 但现在的问题是,如果文件名包含空格字符, args[1]包含了从真实的不同的文件名。 如题,如果我的文件是在e:\tmp3和文件名是test uesr=doc.doc ,我预计args[1]包含

"e:\tmp3\test user-doc.doc",

但它实际上包含了

"E:\tmp3\TESTUS~1.DOC"

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

Answer 1:

前面已经提到,这些都是8.3文件名。 如果你需要从一个简短的名称转换为全名,那么你可以很容易地用C#做到这一点。

new FileInfo("E:\tmp3\TESTUS~1.DOC").FullName

走另一条路需要的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();
    }
}


Answer 2:

你应该把双引号周围的%1更换的shell\open\command的注册表项。 例如:

"C:\Program Files\MyApp\MyApp.exe" "%1"

而不是

"C:\Program Files\MyApp\MyApp.exe" %1

如果不包括双引号,Windows检测到带有空格(或其它参数分隔符)的文件名是不大可能奏效,并替换短文件名。 这是16位Windows程序(兼容HKCR\shell键介绍为Windows 3.1)。



Answer 3:

他们被称为8.3文件名 。 基本上,他们是在缩短文件路径的文件分配表文件的别名。

8.3指的是“8个字符..然后点..然后3个字符”。 这三个字符文件扩展名明显..

此外,您会注意到, TESTUS~1的长度为8个字符。

据我所知,确实没有什么可以做,从这样停止Windows。 你可以格式化你的磁盘是NTFS,我认为(我不认为NTFS是文件“走样”等等aggresive)。



Answer 4:

问题是用空格字符(空的),因为它会认为它是ARGS [2]即测试用户doc.doc将被视为有两个参数,而不是一个因空白字符,所以你可以使用子字符串函数与计算参数的个数总数以及,然后第一串联于argS [1]所有参数传递给ARGS [n],其中n是ARGS的大小,这种方式就可以避免这个问题



文章来源: Why “test user-doc.doc” ==> TESTUS~1.DOC?