更新后ClickOnce文件被覆盖

问题描述 投票:0回答:1

我的 clickonce 应用程序包含一个包含数据的文件。其构建操作设置为“内容较新,则复制到输出目录”。用户在使用应用程序时将更改此数据文件。进行 clickonce 更新后,该文件将被原始文件覆盖。 我可以做什么来避免这种情况?如果我将此文件的发布选项设置为“排除”或“数据文件”,用户的文件将被删除。如果我将选项设置为“包含”,用户的文件将被覆盖。

除了在第一次启动时动态创建第二个文件(显然不在输出目录中)并将文件数据存储在那里之外,是否有任何快速解决方案?

c# wpf vb.net
1个回答
0
投票

我还在使用 ClickOnce 应用程序,并通过远程 Web 服务器进行更新,然后每次客户启动应用程序时,文件都会被覆盖。

一个合适的解决方案可能是,如上面简短回答的那样,将不应更新的文件复制到与主应用程序所在的文件夹不同的文件夹中。

此方法适用于每种类型的文件,目标文件夹可以是 %appdata% 文件夹,因此通过 C#,您可以通过以下方式检索此路径:

string appdatapath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

现在,当应用程序启动时,您必须检查上面的appdatapath中是否存在专用文件夹;如果没有,您可以创建它并复制其中有趣的文件;如果更新应用程序时该文件夹已存在,您可以将已保存文件的备份副本复制回主应用程序文件夹。通过这种方式,您可以保留这些文件,以便每次应用程序的更新过程都会重写。

虽然这种方法能够正常工作,但也有一个缺点。

当你要卸载应用程序时这个备份文件夹,因为在应用程序文件夹之外,不会被删除!因此,请注意以清晰的方式存储此文件,特别是如果它们与私人信息、密钥、密码或其他敏感内容相关。

为了克服这种限制,解决方案可能是在加密文件后存储文件,这样内容“理论上”将受到虚拟保护,或者至少比以原始方式保存的内容受到更多保护。

此任务的另一个方面是应用程序本身是否需要更新某些文件(例如,考虑一个本地数据库,该数据库必须充当从不同传感器获取的某些数据的动态数据存储),然后在一段时间后应用程序本身需要更新。

在这种情况下,要存储的信息不是静态的,您需要在用户关闭应用程序之前对其进行备份。因此,您需要在应用程序关闭时进行检查,因此如果要保留的某些文件已更改,您需要将它们存储在备份文件夹中。

所以看起来没问题,但是让我们看看这里可能存在什么问题。如果应用程序被强制以不干净的方式关闭,则可能不会执行此任务,并且如果计划在下一次应用程序启动时执行应用程序更新(这是 ClickOnce 向导提供的选项),则可能会丢失一些数据,因为上次应用程序关闭期间,某些数据未备份。

不幸的是,至少我现在还没有在标准 ClickOnce 设置中找到解决方案,没有选项可以在第一次部署后排除某些文件的更新,然后必须实施一些替代方法来克服这种限制。

致以最诚挚的问候。 火

© www.soinside.com 2019 - 2024. All rights reserved.