如何决定在哪里存储每个用户的状态?注册表?应用程序数据?隔离存储?

Posted

技术标签:

【中文标题】如何决定在哪里存储每个用户的状态?注册表?应用程序数据?隔离存储?【英文标题】:How to decide where to store per-user state? Registry? AppData? Isolated Storage? 【发布时间】:2010-10-27 07:38:27 【问题描述】:

Windows 注册表什么时候应该用于每个用户的状态,什么时候我们应该使用文件系统,尤其是用户的 AppData 文件夹? (例如,C:\Users\USERNAME\AppData)。隔离存储从何而来?

是否有一个相当严格的规则,或者它只是一个模糊的东西,比如“使用注册表,直到它变得太多数据无法存储在注册表中”。或“使用任何你喜欢使用的东西。”

是否存在影响决定的 Windows 徽标要求?

如果我使用 AppData 目录,如何在 Local、Roaming 和 LocalLow 之间进行选择?

编辑:我刚刚注意到这些类似的问题:

When and why should you store data in the Registry? Registry vs Ini file for storing user-configurable app settings。

我会总结回复。

【问题讨论】:

【参考方案1】:

如果您有少量的键/值对并且值不大,那么注册表很好 - 而且您不关心 xcopy 部署 - 然后使用注册表(我知道这不准确,但是当使用注册表变得很痛苦时,通常很明显)。

如果您想要 xcopy 部署,数据显然必须与程序位于同一文件夹中 - 但程序可以位于 AppData 文件夹下的某个位置,它不必位于“程序文件”下。

仅在需要或必须使用时使用隔离存储 - 例如 ClickOnce。

否则使用 AppData\Roaming,仅在有充分理由的情况下使用 Local 或 LocalLow。

编辑:这是漫游、本地和 LocalLow 之间的区别:

Windows 有一个鲜为人知的功能,称为“漫游配置文件”,总体思路是在启用此功能的企业环境中,任何用户都可以使用任何计算机。

当用户登录时,他的私人设置从服务器下载,当他退出时,他的设置被上传回服务器(实际过程显然更复杂)。

Vista 中用户的“漫游”文件夹或 XP 中的“应用程序数据”中的文件随用户移动 - 因此任何设置和数据都应存储在那里。

vista 中的“Local”和“LocalLow”下的文件以及 XP 中的“Local Settings”下的文件没有,因此它是放置临时文件、与特定计算机相关联的东西或可以重新计算的数据的好地方。

在 Vista 中,作为我们都知道和喜爱的新安全功能的一部分,您可以让程序以“低完整性模式”运行(例如 IE 处于保护模式),这些程序以降低的权限运行并且不能访问用户配置文件中的文件 - “LocalLow”文件夹下的文件除外。

因此,总而言之,存储在“LocalLow”中的文件本质上是不安全的,并且“Local”/“Local Settings”中的文件可能在某些大公司中不可用 - 所以除非您有充分的理由并且确切地知道自己是什么使用“漫游”/“应用程序数据”。

【讨论】:

您能否详细说明 AppData\Roaming 与本地 - 为什么它更好? Sergey,我已经添加了您要求的信息,希望您觉得有用 %APPDATA% 指向漫游文件夹。有没有指向本地文件夹的? (%APPDATA%\..\local 除外) @Vaccano - %LOCALAPPDATA%(至少在windows 7上),您可以通过打开cmd窗口并输入“set”(不带参数)来查看所有定义的环境变量【参考方案2】:

不要弄乱我的注册表谢谢。

使用隔离存储,这就是它的用途。

在 Jeffs 博客上查看 Was The Windows Registry a Good Idea?...

【讨论】:

【参考方案3】:

您可能需要考虑Isolated Storage。

【讨论】:

好的,谢谢。好资料。隔离存储使用 AppData 中的子目录作为实际位置。它也很好地隔离。所以我想这归结为一个基于大小的决定。如果它需要多个 reg 条目,那么使用隔离存储?【参考方案4】:

我不知道是否有一个固定的规则,但要考虑的一件事是注册表是事务性的——并发读/写操作更安全。因此,如果您的用户数据可能在运行时由多个线程写入(或者如果您的产品包中有多个 exe),请考虑使用注册表。

历史: MS 从 .ini 文件转到注册表的一个原因(据我所知)正是为了尝试处理并发访问问题。

.Net(有点)以 xml .config 文件的形式返回到 .ini 文件,但是这些配置文件不应该在运行时写入(或者至少如果有并发写入者的机会,则不应该写入/读者)。

更多信息:http://blogs.msdn.com/oldnewthing/archive/2007/11/26/6523907.aspx

【讨论】:

用户配置文件设计为在运行时修改。

以上是关于如何决定在哪里存储每个用户的状态?注册表?应用程序数据?隔离存储?的主要内容,如果未能解决你的问题,请参考以下文章

Flux:中间错误应该存储在哪里?

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

nodejs:会话存储在哪里?啥是连接蒙戈?

Backbone.js - 在哪里存储状态信息?

环境变量存储在注册表中的哪里?

如何区分应用程序状态和资源状态