代码之家  ›  专栏  ›  技术社区  ›  Arxeiss

C#显示帮助-无法删除chm文件

  •  1
  • Arxeiss  · 技术社区  · 12 年前

    我做了一个小程序,你不必安装。因此,当我想显示帮助时,我必须从参考资料中提取它,这非常有效,并且我保存了一个指向该文件的路径。

    然后,当我调用ShowHelp时,我会传递提取文件的路径。在关闭事件中,我试图删除此文件,但出现了问题。

    当我使用

    Help.ShowHelp(this,pathToChmFile);
    

    它工作得很好,我可以删除文件,但当我通过topicId时,就像这样

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

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

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

    1 回复  |  直到 12 年前
        1
  •  1
  •   Hans Passant    12 年前

    在这种情况下产生垃圾是不可避免的。您无法确保文件被删除。首先,当程序崩溃太多时,用户通常会卸载程序。您无法将资源提取到与EXE相同的目录中,因为您的程序无法访问典型的安装位置进行写入。UAC停止了这种做法。当用户复制EXE时,她将得到提升的提示,但您自己的操作没有提供这样的提示。您必须提取到%AppData%或TEMP文件夹,您的用户将永远找不回该文件。至少有一种机制可以删除TEMP中的旧垃圾,所以请使用Path.GetTempPath()。

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

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