我的Tcl应用程序应该读取并存储许多配置参数。我想使用常规磁盘文件作为存储而不是注册表或其他东西。
按层次结构存储参数会很棒。我的所有参数都是字符串,数字和列表。配置文件可以放在目录中(不仅是用户的家)。通常,应用程序需要当前目录中的配置文件。
你知道任何现成的Tcl库吗?
更一般的问题:读/写应用程序配置的“Tcl-way”是什么?
感谢。
答案 0 :(得分:2)
如果配置不一定需要人类可读,我建议您考虑使用Sqlite - 它最初是作为Tcl扩展,因此Tcl的Sqlite绑定比任何其他语言更成熟。
答案 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}
现在,如果您想要更具想象力或“可互操作”,请查看YAML或JSON(您需要为此编写序列化程序)或INI格式 - 全部来自Tcllib,因此是普通的Tcl。
更加发烧友可能是通过TDOM(基于expat的C扩展)使用XML。已经提出的SQLite比这更有能力(提供对数据的随机访问,能够在巨大的数据阵列上运行)。但似乎对于你的任务来说,这些工具看起来太重了。
请注意,我的示例故意选择显示如何存储/恢复任意ad-hoc变量列表,以便cf_write
过程构建要自行存储的Tcl列表。当然,没有人会阻止你自己构建一个,提供创建任意复杂性的层次结构。需要注意的是,在这种情况下,您可能(或可能不会)面临解构恢复列表的问题。但是如果你坚持每个元素的一般规则是一个名称/值对,就像在我的例子中那样,解构应该不难。
答案 2 :(得分:1)
tcllib包含一个 inifile 包,用于处理Windows .ini文件格式配置文件。因为它是tcllib的一部分,它应该可以在所有平台上使用(我刚检查过,它在我的Solaris 8机箱上加载正常)。它允许您同时读取和写入.ini文件,并按部分和键访问配置。