Why are INI files deprecated in favor of the registry? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071126-00/?p=24383
Raymond Chen 2007年11月26日
为什么弃用 INI 文件而改用注册表?
欢迎,Slashdot的读者们。请记住,本网站仅供娱乐。为什么INI文件被弃用,而注册表取而代之?INI文件存在许多问题:
注册表试图解决这些问题。你可能会争论这些顾虑是否合理,但 Windows NT 团队认为它们是合理的。
评论者TC指出,钟摆又摆回了文本配置文件,但这次是XML。这样一来,INI 文件所存在的许多问题又重新出现了,但它有一个最大的优点,那就是没有人会向 XML 配置文件写入内容,他们只会从中读取。XML 配置文件不是用来存储用户设置的,它们只包含程序本身的信息。让我们再来看看这些问题。
XML设法绕过了INI文件所拥有的许多问题,但前提是你承诺只从中读取(并且如果每个人都同意使用符合标准的解析器),以及如果你不需要超出文件级别的安全性细粒度。一旦你写入它们,那么许多INI文件问题就会重新出现。
- INI文件不支持Unicode。尽管有私有配置文件函数的Unicode版本,但最终它们只是将ANSI文本写入INI文件。(有一种非常规的方法可以创建Unicode INI文件,但你必须超出API才能做到这一点。)在16位Windows中这不是问题,因为16位Windows也不支持Unicode!😓
- INI文件的安全性不够细粒度。由于它只是一个文件,你设置的任何权限都是文件级别的,而不是键级别。你不能说,“任何人都可以修改这一节,但那一节只能由管理员修改。”在16位Windows中这不是问题,因为16位Windows没有安全性。😓
- 多个写入者对INI文件可能导致数据丢失。考虑两个线程试图更新INI文件。如果它们同时运行,你可能会得到这样的结果
线程1 线程2 读取INI文件 读取INI文件 写入INI文件 + X 写入INI文件 + Y 注意,线程2对INI文件的更新意外地删除了线程1所做的更改。在16位Windows中这不是问题,因为16位Windows是合作式多任务的。只要你在读取和写入之间不放弃CPU,你就是安全的,因为没有人能在你放弃之前运行。😁
- INI文件可能会遭受拒绝服务。一个程序可以以独占模式打开INI文件并阻止其他人。如果INI文件被用来保存安全信息,这是很糟糕的,因为它阻止任何人查看这些安全设置。在16位Windows中这也是一个问题,但由于16位Windows没有安全性,一个想要对INI文件发起拒绝服务攻击的程序可以简单地删除它!
- INI文件只包含字符串。如果你想存储二进制数据,你必须以某种方式将其编码为字符串。
- 解析INI文件相对较慢。每次你在INI文件中读取或写入一个值,文件都必须被加载到内存中并解析。如果你向INI文件写入三个字符串,那么这个INI文件就被加载和解析了三次,并被写入磁盘三次。在16位Windows中,三个连续的INI文件操作只会解析一次,写入一次,因为操作系统是合作式多任务的。当你访问INI文件时,它被解析到内存并缓存。当你最终放弃CPU给另一个进程时,缓存会被刷新。
- 许多程序打开INI文件并直接读取它们。这意味着INI文件格式被锁定,无法扩展。即使你想向INI文件添加安全性,你也不能。更重要的是,许多解析INI文件的程序都有缺陷,所以实际上你不能在INI文件中存储超过大约70个字符的字符串,否则会导致其他程序崩溃。
- INI文件的大小限制为32KB。
- INI文件的默认位置是Windows目录!这对Windows NT来说绝对是不好的,因为只有管理员才有写入权限。
- INI文件只包含两个级别的结构。INI文件由节组成,每个节由字符串组成。你不能在一个节内放置其他节。
- [9点添加] 集中管理INI文件很困难。由于它们可以在系统的任何地方,网络管理员不能编写脚本询问,“每个人都在使用最新版本的Firefox吗?”他们也不能部署脚本说“将每个人的Firefox设置设置为XYZ并拒绝写入访问,以便他们不能更改它们。”
- XML文件支持Unicode。
- XML文件的安全性不够细粒度。但由于XML配置文件是只读的,主要的反对意见被回避了。(但如果你想让只有管理员有权限读取XML的特定部分,那么你就麻烦了。)
- 由于XML配置文件是只读的,你不必担心多个写入者。
- XML配置文件文件可能会遭受拒绝服务。你仍然可以独占地打开它们并阻止其他进程。
- XML文件只包含字符串。如果你想存储二进制数据,你必须以某种方式进行编码。
- 解析XML文件相对较慢。但由于它们是只读的,你可以安全地缓存解析结果,所以你只需要解析一次。
- 程序手动解析XML文件,但XML格式已经被锁定,所以你无论如何都不能扩展它,即使你想。希望这些程序使用符合标准的XML解析器而不是自己编写,但如果人们编写了自己的自定义XML解析器,可能会在处理指令或长于70个字符的字符串时出现问题,我也不会感到惊讶。
- XML文件没有大小限制。
- XML文件没有默认位置。
- XML文件具有复杂结构。元素可以包含其他元素。