【问题标题】:C# ShowHelp - unable to delete chm fileC# ShowHelp - 无法删除 chm 文件
【发布时间】:2012-08-02 06:19:09
【问题描述】:

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

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

当我使用时

Help.ShowHelp(this,pathToChmFile);

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

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

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

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

【问题讨论】:

  • 我有几个理论。我正在研究解决方案,不会太久
  • 你刚刚发现,当你使用Help.ShowHelp(this,path,"linkToHtml.html");时,你可以删除这个文件。但是这样比较难看,topicId更友好,甚至topicIds也只是html文件的新名字,不用在程序中写文件名...
  • 我相信TopicId应该可以实现
  • 你是用rm.ReleaseAllResources();释放帮助资源吗?
  • Resource.Close(); 关闭资源的句柄?

标签: c# html-helper chm


【解决方案1】:

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

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

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

【讨论】:

  • 我将 chm 文件解压缩到 Application.LocalUserAppDataPath 并尝试删除此文件夹。如果程序无法删除此文件夹,则不会为用户显示错误消息。但我知道,该文件仍然存在。
  • 好吧,我在回答中特别提到了这一点。建议 使用该目录。摆脱该目录的唯一真正可靠的方法是使用卸载程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多