Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么;测试用户文档“doc.doc”==&燃气轮机;TESTUS~1.DOC?_C#_File_Double Click - Fatal编程技术网

C# 为什么;测试用户文档“doc.doc”==&燃气轮机;TESTUS~1.DOC?

C# 为什么;测试用户文档“doc.doc”==&燃气轮机;TESTUS~1.DOC?,c#,file,double-click,C#,File,Double Click,我编写了一个c#程序,并将其与未安装MS Office的PC中的文件扩展名相关联,如DOC。然后,我双击任何名称包含空白字符的文件,我的程序将启动以打开该文件。我使用了以下语句: string[] args = Environment.GetCommandLineArgs(); 然后,args[1]将包含该文件的完整路径文件名。然后,我可以打开它。但现在的问题是,如果文件名包含空白字符,args[1]包含与实际文件名不同的文件名。作为标题,如果我的文件位于e:\tmp3中,并且文件名为test

我编写了一个c#程序,并将其与未安装MS Office的PC中的文件扩展名相关联,如
DOC
。然后,我双击任何名称包含空白字符的文件,我的程序将启动以打开该文件。我使用了以下语句:

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"

有人能告诉我为什么以及如何解决这个问题吗?谢谢。

问题是空间特性(空白的),因为它会考虑它。 as args[2]即test user-doc.doc将被视为两个arg,而不是一个arg 由于字符为空,所以可以使用子字符串函数,进行计算 参数总数,然后首先将所有参数从参数[1]连接到参数[n]
其中n是ARG的大小,这样就可以避免问题

< p>问题是空格字符(空白字符),因为它会考虑它。 as args[2]即test user-doc.doc将被视为两个arg,而不是一个arg 由于字符为空,所以可以使用子字符串函数,进行计算 参数总数,然后首先将所有参数从参数[1]连接到参数[n] 其中n是arg的大小,这样可以避免调用arg时出现的问题。基本上,它们是文件分配表中文件的别名,缩短了文件的路径

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

另外,您将注意到
TESTUS~1
的长度为8个字符

据我所知,要阻止Windows这样做,你真的没有什么办法。我认为,您可以将磁盘格式化为NTFS(我不认为NTFS对文件“别名”的攻击性很大)。

它们被称为NTFS。基本上,它们是文件分配表中文件的别名,缩短了文件的路径

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

另外,您将注意到
TESTUS~1
的长度为8个字符


据我所知,要阻止Windows这样做,你真的没有什么办法。我想,您可以将磁盘格式化为NTFS(我不认为NTFS对文件“别名”的攻击性太大)。

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

走另一条路需要一个PInvoke呼叫。as短名称可以关闭,但默认情况下操作系统所在卷的短名称是打开的

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();
    }
}

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

走另一条路需要一个PInvoke呼叫。as短名称可以关闭,但默认情况下操作系统所在卷的短名称是打开的

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();
    }
}

您应该在
shell\open\command
注册表项中的
%1
替换项周围加上双引号。例如:

"C:\Program Files\MyApp\MyApp.exe" "%1"
而不是

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

如果不包含双引号,Windows会检测到带有空格(或其他参数分隔符)的文件名不太可能工作,并替换短文件名。这是为了与16位Windows程序兼容(Windows 3.1引入了
HKCR\shell
键)。

您应该在
shell\open\command
注册表项中的
%1
替换项周围加上双引号。例如:

"C:\Program Files\MyApp\MyApp.exe" "%1"
而不是

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

如果不包含双引号,Windows会检测到带有空格(或其他参数分隔符)的文件名不太可能工作,并替换短文件名。这是为了与16位Windows程序兼容(Windows 3.1引入了
HKCR\shell
键)。

+1.我的回答基本上把我对这门学科的知识扩展到了极限!它起作用了。非常感谢。这个示例代码给了我很多帮助。不用担心,StanHuangatTaiwan。如果这个答案已经解决了你的问题,请点击检查标记来考虑。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这么做。大卫·埃文,谢谢你提醒我。这是我第一次这么做。希望我已经做对了。太棒了+1.我的回答基本上把我对这门学科的知识扩展到了极限!它起作用了。非常感谢。这个示例代码给了我很多帮助。不用担心,StanHuangatTaiwan。如果这个答案已经解决了你的问题,请点击检查标记来考虑。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。没有义务这么做。大卫·埃文,谢谢你提醒我。这是我第一次这么做。希望我已经做对了。args[2]不存在,因为args.Length为2。args[2]不存在,因为args.Length为2。我的程序将在其他计算机上运行。将磁盘格式化为NTFS似乎不是一个好主意。:)我的程序将在其他人的计算机上运行。将磁盘格式化为NTFS似乎不是一个好主意。:)