我编写了一个c#程序,并将它与没有安装MS的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"有人能告诉我为什么怎么解决吗?谢谢。
发布于 2014-04-18 06:28:58
如前所述,这些是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();
}
}发布于 2014-08-15 16:04:46
您应该在%1注册表项中的shell\open\command替换项周围加上双引号。例如:
"C:\Program Files\MyApp\MyApp.exe" "%1"而不是
"C:\Program Files\MyApp\MyApp.exe" %1如果不包括双引号,Windows会检测到带有空格(或其他参数分隔符)的文件名不太可能工作,并替换短文件名。这是为了与16位Windows程序兼容(Windows3.1引入了HKCR\shell键)。
发布于 2014-04-18 03:55:32
他们被称为8.3文件名。基本上,它们是文件分配表中文件的别名,它缩短了文件的路径。
8.3指“8个字符.然后是一个圆点.然后是3个字符”。这三个字符显然是文件扩展名。
另外,您将注意到TESTUS~1的长度为8个字符。
据我所知,实际上没有什么可以阻止Windows这样做。您可以将磁盘格式化为NTFS,我认为(我不认为NTFS与文件“混叠”有这么大的关系)。
https://stackoverflow.com/questions/23147054
复制相似问题