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

时间:2012-02-17 12:36:08

标签: c# installer registry

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

[TARGETDIR] myexecutable.exe%1

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

C:\ Documents and Settings \ user \ Desktop \ teestqqqq.xls

它会给我:

C:\ DOCUME〜1 \用户\桌面\ TEEST〜1.XLS

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

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

4 个答案:

答案 0 :(得分:3)

%1替换为"%1",即加上引号,您将获得长文件名。问题是'文档和设置'在其名称中有空格,无法在没有引号的情况下正确传递给您的程序。这就是为什么shell将路径转换为短名称,没有空格,然后将其传递给您的程序。

答案 1 :(得分:2)

尝试

Path.GetFullPath(path)

应该这样做。但是你应该能够使用短路径。

答案 2 :(得分:1)

你可以尝试:

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

答案 3 :(得分:1)

在“长文件名”之前很久。 MS DOS中的文件名限制为8个字符,后跟一个点,最多3个字符用于扩展名。您看到的是具有长文件名的路径的简短版本。这是一个较长的解释:http://www.computerhope.com/issues/ch000209.htm

现在解释给定路径如何为您解决问题?因为Windows API也应该能够使用短文件名版本。

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

引用文档:

  

如果传入短文件名,则会扩展为长文件名。