需要一个Tcl库来读/写配置文件

时间:2011-11-08 17:39:47

标签: tcl

我的Tcl应用程序应该读取并存储许多配置参数。我想使用常规磁盘文件作为存储而不是注册表或其他东西。

按层次结构存储参数会很棒。我的所有参数都是字符串,数字和列表。配置文件可以放在目录中(不仅是用户的家)。通常,应用程序需要当前目录中的配置文件。

你知道任何现成的Tcl库吗?

更一般的问题:读/写应用程序配置的“Tcl-way”是什么?

感谢。

3 个答案:

答案 0 :(得分:2)

如果配置不一定需要人类可读,我建议您考虑使用Sqlite - 它最初是作为Tcl扩展,因此Tcl的Sqlite绑定比任何其他语言更成熟。

请参阅:http://www.sqlite.org/tclsqlite.html

答案 1 :(得分:2)

如果您不需要随机访问(即配置文件不是很大并且每个都可以一次完全啜饮)并且不需要外部工具处理,您可以使用包含的平面文本文件,例如, Tcl列表。 “技巧”是在Tcl中每个值必须具有有效的字符串表示(当被询问时)并且可以从其字符串表示重构。你可以免费获得它,也就是说,不需要特殊的包,所有你必须提供的是将序列化值绑定到它们名称的某种结构。

演示:

set a "a string"
set b 536
set c {this is a list {with sublist}}

proc cf_write {fname args} {
  set fd [open $fname w]
  chan config $fd -encoding utf-8
  set data [list]
  foreach varName $args {
    upvar 1 $varName var
    lappend data [list $varName $var]
  }
  puts $fd $data
  close $fd
}

proc cf_read fname {
  set fd [open $fname]
  chan config $fd -encoding utf-8
  set data [read $fd]
  close $fd
  set data
}

set cfile [file join [file dir [info script]] conf.txt]
cf_write $cfile a b c
foreach entry [cf_read $cfile] {
  lassign $entry name value
  puts "$name: $value"
}

你会得到这个输出:

a: a string
b: 536
c: this is a list {with sublist}

现在,如果您想要更具想象力或“可互操作”,请查看YAMLJSON(您需要为此编写序列化程序)或INI格式 - 全部来自Tcllib,因此是普通的Tcl。

更加发烧友可能是通过TDOM(基于expat的C扩展)使用XML。已经提出的SQLite比这更有能力(提供对数据的随机访问,能够在巨大的数据阵列上运行)。但似乎对于你的任务来说,这些工具看起来太重了。

请注意,我的示例故意选择显示如何存储/恢复任意ad-hoc变量列表,以便cf_write过程构建要自行存储的Tcl列表。当然,没有人会阻止你自己构建一个,提供创建任意复杂性的层次结构。需要注意的是,在这种情况下,您可能(或可能不会)面临解构恢复列表的问题。但是如果你坚持每个元素的一般规则是一个名称/值对,就像在我的例子中那样,解构应该不难。

答案 2 :(得分:1)

tcllib包含一个 inifile 包,用于处理Windows .ini文件格式配置文件。因为它是tcllib的一部分,它应该可以在所有平台上使用(我刚检查过,它在我的Solaris 8机箱上加载正常)。它允许您同时读取和写入.ini文件,并按部分和键访问配置。

相关问题