如何决定存储每个用户状态的位置?注册表?AppData?隔离存储?

23
何时应该使用Windows注册表来存储每个用户的状态,何时应该使用文件系统,特别是用户的AppData文件夹?(例如,C:\ Users \ USERNAME \ AppData)。独立存储在哪里?是否存在明确的规则,或者它只是一个模糊的东西,像“在注册表中使用,直到存储在注册表中的数据太多”或“使用任何您喜欢的方法”。有哪些影响决策的Windows标志要求?如果我使用AppData目录,如何在Local、Roaming和LocalLow之间进行选择?编辑:我刚刚注意到这些类似的问题:何时以及为什么应该在注册表中存储数据? 与Ini文件相比,Registry用于存储用户可配置的应用程序设置。我将总结回复。
4个回答

14

如果您有一小组键/值对且值不大,那么注册表非常适合使用 - 并且您不关心xcopy部署 - 那么请使用注册表(我知道这不是很准确,但通常在使用注册表变得繁琐时很明显)。

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

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

否则,请使用AppData\Roaming,仅在有充分理由时才使用Local或LocalLow。

编辑:以下是Roaming、Local和LocalLow之间的区别:

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

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

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

Vista中的“Local”和“LocalLow”下的文件以及XP中的“Local Settings”下的文件不会移动,因此这是临时文件、与特定计算机相关或可以重新计算数据的好地方。

在Vista中,作为我们都熟知和喜爱的新安全功能的一部分,您可以将程序运行在“低完整性模式”中(例如IE受保护模式),这些程序使用降低的权限运行,并且无法访问用户个人资料文件夹中的文件 - 除了位于“LocalLow”文件夹下的文件。

因此,总之,存储在“LocalLow”中的文件本质上是不安全的,“Local”/“Local Settings”中的文件可能在某些大公司中无法使用 - 因此,除非您有充分理由并确切知道自己在做什么,否则选择“Roaming”/“Application Data”。


你能详细说明一下AppData\Roaming和Local的区别吗?为什么它更好? - Sergey Aldoukhov
1
Sergey,我已经添加了你要求的信息,希望你会觉得有用。 - Nir
%APPDATA%指向漫游文件夹。是否有一个指向本地文件夹的文件夹?(除了%APPDATA%..\local之外) - Vaccano
1
@Vaccano - 在Windows 7上,%LOCALAPPDATA%表示本地应用程序数据文件夹路径。您可以通过打开cmd窗口并键入“set”(无参数)来查看所有定义的环境变量。 - Nir

7

4

好的,谢谢。很有用的信息。Isolated Storage使用AppData中的子目录作为实际位置。它也被很好地隔离了。所以我想这归结于一个基于大小的决定。如果需要超过几个注册表项,那么就使用隔离存储? - Cheeso

1

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

历史: 据我所听,微软从.ini文件转向注册表的一个原因就是为了尝试解决并发访问问题。

.Net(某种程度上)以xml .config文件的形式回到了.ini文件,但是这些配置文件不应该在运行时被写入(或者至少不应该存在并发的写入者/读者)。

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


用户配置文件旨在运行时进行修改。 - Greg Dean

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