C# 为什么;测试用户文档“doc.doc”==&燃气轮机;TESTUS~1.DOC?
我编写了一个c#程序,并将其与未安装MS Office的PC中的文件扩展名相关联,如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
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似乎不是一个好主意。:)