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

8
我有一个需要存储数据的应用程序。目前,我正在使用内置的应用程序设置来实现,但它只提供了两个选择:应用程序和用户范围。理想情况下,我希望有一个“本地”范围,允许应用程序在另一个用户下运行并仍然找到其数据,而不是为该用户重新创建数据。应用程序范围可以做到这一点,但它是只读的。应用程序数据将被用户更改。如果只允许管理员对数据进行更改,那也没关系。
你可能已经猜到了,我有一个管理工具,允许用户更改数据和一个读取数据并执行某些操作的Windows服务运行程序。如果Windows服务运行程序可以访问管理工具创建的数据,那就太好了。

你正在存储什么类型的数据?用户偏好等,还是应用程序使用的数据? - gooch
我正在存储非常简单的数据。几乎永远不会出现存储超过10个对象的情况。这些数据是任务设置(例如名称、目录、要使用的插件等),将在存在于我的管理工具之外的服务中运行。服务能够找到这些信息至关重要。设置是理想的,但从服务中访问似乎会很困难。我该怎么做? - ATL_DEV
2个回答

8
如果数据非常简单,并且需要被其他应用程序或用户(具有适当的权限)读取,我可能会选择将其存储在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(); - ATL_DEV
@joe:如果您想要的是这样,您应该查看XmlSerializer类和System.Xml.Serialization命名空间。您可以使用它们将类结构“自动”序列化为/从XML。您绝对不能将其作为实际Settings对象的一部分;如果您想要使用Settings,则请使用Settings。如果您只想让它成为像Properties.Settings.Default这样的单例对象,则可能需要自己实现该模式。 - Aaronaught
哦,顺便问一下。我应该使用CommonApplicationData文件夹而不是ApplicationData吗?文档上说:“作为所有用户使用的应用程序特定数据的共同存储库的目录。” - ATL_DEV
1
@joe:你可以这样做,但是你需要以管理员权限运行你的应用程序才能使其工作,所以除非你真正需要所有用户共享相同的设置,否则我不会真正建议这样做。如果数据应该是每个用户独有的,那么这是错误的位置。 - Aaronaught

0

听起来你想把它存储在数据库中,问题是本地还是网络上。答案也取决于你要存储什么类型的数据,你的应用程序如何分布以及其他因素。

哦,顺便说一句,如果你指定平台(最好带有标签)--silverlight、wpf、winforms、asp.net、console等,我们可以更好地帮助你。


抱歉,我以为 .NET 标签足以指定平台。无论如何,我认为数据库可能过于复杂了,不符合我的数据持久化需求。这将是一个 WPF 应用程序。 - ATL_DEV
没问题,.NET 可以覆盖我列出的所有平台,包括我没有列出的。 - Muad'Dib

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