我应该在哪里存储我的应用程序数据?

Posted

技术标签:

【中文标题】我应该在哪里存储我的应用程序数据?【英文标题】:Where should I store my application data? 【发布时间】:2011-02-15 14:48:30 【问题描述】:

我有一个需要存储数据的应用程序。目前,我正在使用内置的应用程序设置来执行此操作,但它只给了我两个选择:应用程序和用户范围。理想情况下,我想要一个“本地”范围,允许应用程序在另一个用户下运行,并且仍然可以找到它的数据,而不是为那个用户重新创建它。应用程序范围可以做到这一点,但它是只读的。应用程序数据将由用户更改。如果只允许管理员对数据进行更改就可以了。

您可能已经猜到了,我有一个管理工具,允许用户更改数据和读取数据并对其执行某些操作的 Windows 服务运行程序。如果windows服务运行器访问管理工具创建的数据就好了。

【问题讨论】:

你存储什么样的数据?用户偏好等或应用程序使用的数据? 我正在存储非常简单的数据。几乎不会出现存储超过 10 个对象的情况。数据是任务设置(即名称、目录、要使用的插件等),它们将在我的管理工具之外存在的服务中运行。服务必须能够找到此信息。设置将是理想的,但从服务访问它似乎会很困难。我该怎么做? 【参考方案1】:

听起来您想将其存储在数据库中,问题是本地的还是网络上的。答案还取决于您存储的数据类型、应用的分发方式以及其他因素。

哦,顺便说一句,如果您指定您的平台(最好带有标签)-silverlight、wpf、winforms、asp.net、控制台等,我们可以为您提供更好的帮助。

【讨论】:

抱歉,我认为 .NET 标记足以指定平台。无论如何,我认为数据库对于我的数据持久性需求来说可能是多余的。这将是一个 WPF 应用程序。 没关系,.NET 可以覆盖我列出的所有平台,以及我没有覆盖的平台。【参考方案2】:

如果数据非常非常简单,并且您需要它可以被其他应用程序或用户读取(具有适当的权限),我可能会选择将其存储在 XML 文件中,甚至是纯文本文件中的用户的应用程序数据文件夹,可通过Environment.GetFolderPath 获取。保存示例可能如下所示:

using System.IO;
using System.Xml.Linq;

string settingsDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
if (!Directory.Exists(settingsDirectory))
    Directory.CreateDirectory(settingsDirectory);
string fileName = "tasks.xml";
string settingsPath = Path.Combine(settingsDirectory, fileName);
XDocument settingsDoc = new XDocument(
    new XElement("Tasks",
        new XElement("Task",
            new XElement("Name", "Make Breakfast"),
            new XElement("Location", @"C:\Program Files\MyApp\Plugins"),
            new XElement("FileName", "breakfast.dll"))));
// ... etc.
settingsDoc.Save(settingsPath);

就是这样 - 设置已保存!您可以使用XDocument.Load 再次加载它们。

【讨论】:

谢谢!这很棒。反正有没有像 settings.settings 那样强类型化的工作?我希望能够做这样的事情: Settings.Default.Tasks= TaskList; Settings.Default.Save(); @joe:如果这是您想要的,您应该查看XmlSerializer 类和System.Xml.Serialization 命名空间。您可以使用这些来获取类结构并“自动”序列化到 XML 或从 XML 序列化。你绝对不能把这部分变成实际的Settings 对象;如果您想使用Settings,请使用Settings。如果您只是希望它是像 Properties.Settings.Default 这样的单例对象,那么这是可能的,但您必须自己实现该模式。 哦,顺便说一句。我应该使用 CommonApplicationData 文件夹而不是 ApplicationData 吗?文档说“该目录用作所有用户使用的特定于应用程序的数据的公共存储库。” @joe:你可以,但是你需要以管理员权限运行你的应用程序才能工作,所以我不会真的推荐它,除非你 实际上需要所有用户共享相同设置。如果数据应该是每个用户唯一的,那就错了。

以上是关于我应该在哪里存储我的应用程序数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 FireMonkey 及其跨平台,我应该在哪里存储我的应用程序数据?

我应该在哪里保存我的序列化数据文件? [复制]

我应该在哪里存储我的应用程序的“激活”密钥?

使用 AWS Elastic Beanstalk 我应该在哪里存储我的应用程序代码?

我的应用程序需要发送电子邮件,我应该在哪里以及如何存储 SMTP 密码?

OSX:在哪里存储应用程序的 SQLite 文件?