使用 FileOptions.DeleteOnClose 创建文件,写入文件并在之后看到它被删除

Posted

技术标签:

【中文标题】使用 FileOptions.DeleteOnClose 创建文件,写入文件并在之后看到它被删除【英文标题】:Create file with FileOptions.DeleteOnClose, write to it and see it getting deleted after 【发布时间】:2018-04-15 05:50:59 【问题描述】:

我正在尝试制作一个只有一个 exe 文件的程序。这是一个要求。

但我还必须为该程序实现帮助,以便用户知道什么做什么。我决定制作一个 chm 文件并使用 HelpProvider。最初我以为我可以嵌入 chm 文件并告诉 HelpProvider 从 resources.resx 打开它。

好吧,那没用。

由于我不知道显示帮助的任何其他选项,因此无需向程序添加更多文件或使用在线托管或其他方式,我决定将嵌入式 chm 写入磁盘(当用户打开它时)并在之后删除它(这是在我未能在内存中想出这样做的方法之后)。

问题是创建带有FileOptions.DeleteOnClose 标志的文件并写入它。如果我

File.Create(path, 100, FileOptions.DeleteOnClose);
File.WriteAllBytes(path, mychm);

文件被Create 方法锁定。如果我将using 放在Create 方法上,则文件会在写入前被删除。

【问题讨论】:

File.Create 给你一个FileStream。仅将其用于写入,并将其保存在一个字段中,这样有问题的流就不会被垃圾收集。完成后明确地处理它。 它不会飞。程序(如 hh.exe,帮助查看器)需要使用 FileShare.Write 和 FileShare.Delete 打开此文件,但它不会这样做。对于这种不切实际的要求寻求帮助是没有用的。 您为什么不创建和删除帮助文件而不是创建另一个带有帮助的项目并将其合并到您的 exe 中,如下所述:***.com/questions/10137937/merge-dll-into-exe。 @HansPassant,这有什么不切实际的?你说得好像我应该只为简单的事情寻求帮助。是的,这真的很有用。 @Nick 但我将如何在没有相同问题的帮助下创建另一个项目?即我不明白您所说的“有帮助的项目”是什么意思,我正在尝试为这个项目添加帮助。请详细说明。 【参考方案1】:

好的,所以代码需要是单个 .exe。很公平。

您是否想过让您的应用程序成为实际显示帮助的应用程序?我的意思是,我不知道对帮助的实际要求是什么(可点击的索引?目录?工具提示?等等)——但根据你对用户友好程度的要求,你总是可以简单地添加带有 WebBrowser 对象的 Windows 窗体,并将 html 内容直接注入 WebBrowser(通过 myWebBrowserControl.Document)。

我的意思是,这无论如何都不是最优的。但对于“仅具有单个 .exe 输出的已启用帮助的应用程序”要求,这是一种快速而肮脏的解决方案。

编辑:额外的想法。如果您正在编写此文件以供企业内部使用,您可以将帮助文件放在公司网络上可访问的位置 - 并将您的应用程序链接到远程位置。另一方面,如果您正在开发用户将下载的应用程序,您可以开发在线帮助并将应用程序链接到您的帮助 URL。

【讨论】:

这是个好主意,我只是认为使用 HelpProvider 和 chm 会容易得多。 你可能是对的 - CHM 会让它变得更容易......但在恶作剧之后你必须经历“仅一个文件”,我不确定这是否值得.另外,请查看我编辑的想法 - 如果其中任何一个可行,它们是比我原来的更好的解决方案(我只是不知道在你的工作环境中是否在技术上可行。)

以上是关于使用 FileOptions.DeleteOnClose 创建文件,写入文件并在之后看到它被删除的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)