当前位置: 首页 > news >正文

纯文本配置还是注册表

我们知道Unix/Linux下的程序配置文件从来都是纯文本的,你可以自由地修改和查看,他们也没有什么什么XML之类的玩意(参看XML的这两篇文章:一,二),这个最重要的Unix文化(参看Unix传奇下篇)40多年来就这么沿续下来了。我很佩服Microsoft的创新能力,一会儿用INI,一会儿用注册表,一会又是用XML,这就是Windows的编程中那“强大”的创新。在网上又看到有人在争论为什么用注册表而不是纯文本,所以,写下这篇文章。

引入注册表所谓的原因

首先,让我们来看一下为什么微软觉得要使用注册表而不是ini文件,下面是一些其列出来的ini方面的毛病:

  • ini文件不支持Unicode
  • ini文件的安全权限不够
  • ini文件在多进程下存取会有问题
  • 如果一个进程锁上了这个文件,另一个进程就无法获得,只能出错。
  • ini文件只能包含字符串,无法使用二进制
  • 解析ini文件相对来说性能比较慢,第一次读写都需要把整个文件读入内存,然后再写回去。
  • ini文件最大只有32K
  • ini文件的默认目录在Windows系统目录下,只能这个目录只能Windows管理员才能访问
  • ini只能包含了两层,对于多层不支持。
  • 把ini文件放在中央服务器上管理很困难。

而微软说,注册表可以完美地解决这些问题。居然微软只说到了ini文件,但我觉得不单单是ini,所有的以纯文本方式保存配置文件的方法都会出现上述这样的问题。

我的观点

那么,当你在看到这些言论时,你是怎么想的?你有没有经过自己的独立思考?还是你觉得注册表完美地解决了所有的一切?下面是我的一些观点:

  • 首先,我们要知道没有任何一件事是完美的,凡事必然有好的一面,也有不好的一面。
  • 其次,当我们在改进一个东西时,不单单要解决其不好的东西,还要把其好的东西给传承下来。

所以,当你看到一些只说好或是只说坏的东西时,这往往意味着“宗教”或“洗脑”,这正是需要你独立思考的时候。

纯文本配置文件的好处

下面,是我觉得纯文本配置文件的好处(我用Unix下的纯文本配置文件来举例):

  • 很容易进行版本管理(配置文件和程序代码一样都需要版本控制)
  • 很容易移植到别的平台
  • 很容易自定义文本文件的格式和语法,已也有相关的库支持(ini只支持ANSI字符,只有32K,只支持两级,那是ini的问题,解决这些问题不需要引入注册表)
  • 可以在配置文本中写注释信息
  • 你要很容易的使用grep,awk,sed等等以及来和脚本集成。
  • 你可以很容易地拆分配置文件把其放到conf.d中,这样一来,你就非常灵活
    • 你就不用整个文件都读入内存,
    • 你也可以分别设置上不同的存取权限,
    • 同样可以减小多个进程同时存取的问题
    • 同样可以引用别的二进制配置的文件
  • 你可以很容易地产生备份或是在不同的配置中来回地切换配置文件以进行调试。
  • 你可以很容易地使用rsync来向中央服务器同步你的配置文件。或者使用NFS/NIS直接就把配置放在中央服务器上。

真正的原因

可见,Windows 的注册表并没有把纯文本配置文件的这些好处都带过来,所以,经过这样的独立思考,我们可以知道,微软引入注册表的真正原因是——

  • 让你的程序不具移植性,让你的软件永远运行在Windows上。
  • 增加你编程的复杂度和你维护配置文件的复杂度,让你在痛苦之后,苦苦哀求微软再发布下一个“创新”。

各位程序员——Windows是很危险的,你们还是回火星去吧。

相关文章:

  • “你的优势是什么?
  • 记录项目代码迁移后,UI测试框架的搭建(配置文件的修改、测试脚本试运行)...
  • QComboBox 树形视图选择
  • 用户28万、营收超1亿,《生化危机》给VR游戏做了个好榜样
  • 验证数据过程中碰到的问题记录
  • Python--多进程
  • IE安全系列之:中流砥柱(I)—Jscript 5处理浅析
  • python一条语句分析几个常用函数和概念
  • 使用strtok_s函数从一个字符串中分离出单词
  • Android Studio_更新Gradle
  • MyBatis源码解读之SqlSession
  • 【小松教你手游开发】【系统模块开发】根据上一个GameObject坐标生成的tips界面...
  • 观察者模式在One Order回调函数中的应用
  • grep sed awk 练习题
  • #define与typedef区别
  • HTTP--网络协议分层,http历史(二)
  • js算法-归并排序(merge_sort)
  • php中curl和soap方式请求服务超时问题
  • Python 基础起步 (十) 什么叫函数?
  • Python进阶细节
  • SQLServer插入数据
  • underscore源码剖析之整体架构
  • vue:响应原理
  • windows下如何用phpstorm同步测试服务器
  • 产品三维模型在线预览
  • 程序员该如何有效的找工作?
  • 关于Java中分层中遇到的一些问题
  • 入门到放弃node系列之Hello Word篇
  • 使用common-codec进行md5加密
  • 我这样减少了26.5M Java内存!
  • 新版博客前端前瞻
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #stm32驱动外设模块总结w5500模块
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (六)软件测试分工
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)3D模板阴影原理
  • (转)大道至简,职场上做人做事做管理
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET6 命令行启动及发布单个Exe文件
  • .NET大文件上传知识整理
  • @LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析
  • @RequestMapping 的作用是什么?
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [Angular 基础] - 表单:响应式表单
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)