将文件名传递到注册表项中的.exe

本文关键字:exe 注册表 文件名 | 更新日期: 2023-09-27 18:24:53

我有一个小型安装程序,它将一些.exe和DLL安装到目标机器上,并在注册表中设置一个键,这样用户右键单击Excel文件时就会看到一个新的上下文菜单项。这个命令键的值类似于:

[TARGETDIR]myexecutable.exe%1

%1有效地将文件名传递给args[0]中的可执行文件。我希望这能给我的.exe完整的路径。但它给了我某种压缩路径。例如:

C:''Documents and Settings''user''Desktop''testqqqq.xls

它会给我:

C:''DOCUME~1''user''Deskt''TEEST~1.XLS

这对我来说是个问题。我该怎么解决?我需要一条合适的完整路径。

更新:正如评论和回答中所要求的,这对我来说是一个问题,因为我从收到的路径中获得了一些新的文件夹名称。这些文件夹名称稍后将由一些用户提交,以便SVN存储库。我注意到,在我的用户的一些机器上,.exe接收排序路径,而在其他机器上,接收长路径。对于SVN上的DIFF目的,我的用户认为文件夹名称是"唯一的"。我只需要一种方法来确保文件夹名称的唯一性(我认为在撰写本文时,下面的答案中已经有了我需要的内容)

将文件名传递到注册表项中的.exe

%1替换为"%1",即加引号,您将获得长文件名。问题是"文档和设置"的名称中有空格,如果没有引号,就无法正确传递给您的程序。这就是shell将路径转换为不带空格的短名称,然后将其传递给程序的原因。

尝试

Path.GetFullPath(path)

这样就可以了。但你应该能够走捷径。

您可以尝试:

string shortName = @"C:'DOCUME~1'user'Desktop'TEEST~1.XLS";
string longName = System.IO.Path.GetFullPath(shortName);

长在"长文件名"之前。在MS-DOS中,文件名的名称限制为8个字符,后面跟着一个点,扩展名最多3个字符。您看到的是带有长文件名的短路径。以下是一个更长的解释:http://www.computerhope.com/issues/ch000209.htm

现在解释一下给定的路径对你来说是一个问题?因为windows API也应该能够使用短文件名版本。

正如ken2k所提到的,System.IO.Path.GetFullPath(..)将在给定短文件名路径的情况下返回扩展路径。

引用文件:

如果传入一个短文件名,它将扩展为一个长文件名。