1

我做了一个小程序,你不必安装。所以当我想显示帮助时,我必须从资源中提取它,这很好用,我保存了这个文件的路径。

然后当我调用 ShowHelp 时,我将路径传递给提取的文件。在结束事件中,我尝试删除此文件,这是问题。

当我使用

Help.ShowHelp(this,pathToChmFile);

效果很好,我可以删除文件,但是当我通过 topicId 时,就像这样

Help.ShowHelp(this, pathToChmFile, HelpNavigator.TopicId, "10");

然后当调用 FormClosing 时,我无法删除 chm 文件,因为它是由我的进程打开的。但是为什么当我没有topicId显示它时,我可以删除它?

因为你不能卸载我的程序,我想自己清理“垃圾”,但现在我不能......

4

1 回答 1

1

在这种情况下产生垃圾是不可避免的。您无法确保文件被删除。一方面,当你的程序崩溃太多时,用户通常会卸载它。您不能将资源提取到与 EXE 相同的目录中,您的程序无法访问典型的安装位置进行编写。UAC 阻止了这一点。用户在复制您的 EXE 时将收到提升提示,但您自己的操作没有提供此类提示。您必须解压到 %AppData% 或 TEMP 文件夹,您的用户将永远找不到该文件。至少有一种机制可以从 TEMP 中删除旧垃圾,因此更喜欢使用 Path.GetTempPath()。

另一方面,锁也是不可避免的,它被另一个进程持有。Windows hh.exe 程序显示 .chm 文件内容。当用户退出您的程序但没有先关闭帮助查看器时,您无法做任何合理的事情。没有可靠的方法可以找到正确的 hh.exe 实例来杀死它,可能有多个。

所以你被垃圾困住了,Path.GetTempPath() 是最不令人反感的。除非您将 .chm 文件部署在与 EXE 相同的目录中。如果不是从 .zip 文件,创建 setup.exe 程序对于安装项目来说是非常简单的,不要跳过解决您的问题并使您的用户感到舒适的一件事

于 2012-08-04T16:22:46.133 回答