存放自定义配置文件的位置在哪里?

3
我目前在应用程序目录中存储一个序列化的XML文件,其中包含所有特定于程序操作的更改(不是典型的系统或用户配置)。几周前,我们开始遇到无法正确保存的问题(请参阅关于此问题的我的先前问题)。
长话短说,最终我们发现Windows 7(有时是Vista)在写入应用程序目录(特别是Program Files下的任何内容)时存在问题。如果这是一个普通的配置文件,我只需将其存储在用户的APPDATA文件夹下,但它不是普通的配置文件。我们在自己的仪器上运行它,而误配置是客户运行我们软件的问题原因之一。因此,我们需要使此文件可访问,以便他们可以轻松找到并将其电子邮件发送给我们。对于经验丰富的用户来说,Appdata已经很难找到了,更不用说非常非技术人员了。
我们还尝试以管理员身份运行它,并使文件夹权限完全开放(我们可以控制运行它的每台计算机;它永远不会在某个随机人的机器上运行)。但这些有时有效,有时无效。
最糟糕的是,当我将文件写回时,它甚至不会抛出错误;它只是将其写入某个在某个未知时间点过期的临时目录中。几周后,我们的用户将遇到问题,配置文件全部混乱了。
那么,我的问题是,如果不是在Program Files中,我应该将此文件存储在哪里?我是否应该将其放在APPDATA中,并制作一个小实用程序,在出现问题时自动将其电子邮件发送给我们?或者我可以将其留在Program Files中,但更改某些特定的权限或注册表键以使其正常运行?

AppData就是它的位置。还可以参考我的回答https://dev59.com/1XA75IYBdhLWcg3wlqAT#3219276 - Andreas Rejbrand
1
我知道这是正确的地方,但如果出现问题,我该如何让技术盲的用户发送文件给我们? - drharris
@0xA3 理想情况下,我希望能够修复我们软件中的所有错误以及我们在软件中使用的9-12个硬件供应商和驱动程序的错误,但那样我就不会问这个问题了。;) 当用户发送配置文件时,我可以处理导致问题的每个异常情况,但是许多事情我们无法预见。例如,将一个设备的参数设置为256会导致溢出,即使驱动程序和pinvoke显示它应该达到65k。更有甚者,257却可以正常工作。 - drharris
你的写入操作没有抛出错误的原因是因为你没有清单文件。虚拟存储实际上很容易找到(一旦你知道诀窍),而且不会过期。打开Windows资源管理器,进入你认为应该存在的文件夹(例如,在我的机器上选择路径为C:\Program Files (x86)\Foxit Software\Foxit Reader),然后在地址栏下方的工具栏中点击“兼容性文件”。瞧,你已经找到了虚拟存储。话虽如此,最好给你的应用程序添加一个清单文件,并选择一个适当的每个用户位置来写入此文件。我只是想尽可能揭示虚拟存储的神秘面纱。 - Kate Gregory
谢谢Kate!那些信息非常有帮助。我可能已经无数次地忽略了“兼容性文件”按钮。那本来可以帮我们省下不少电话费用的。非常感谢这些信息。 - drharris
2个回答

1

这取决于用户是否需要直接编辑文件。如果不需要,应将它们放在%APPDATA%中,可以通过以下方式访问:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)

否则,您可以将其放在“我的文档”中:
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

无论如何,将其放在Program Files中都不是一个好主意。正如您发现的那样,即使以管理员身份运行,也会出现权限问题。


用户确实需要偶尔直接编辑它。我甚至没有考虑把它放到我的文档中...通常这将是一个荒谬的想法,但由于这些计算机受我们控制,这将是一个完全可接受的解决方案。 - drharris

1
对于那些用户,您可以创建一个按钮,用于打开该目录。您可以将其放在不起眼的地方,以便稍后引导他们。

对于具有电子邮件客户端的用户,您可以创建一个按钮,用于创建一个新的带有主题并自动附加文件到电子邮件中的电子邮件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接