我的Tcl應用程序應該讀取並存儲大量的配置參數。我想使用常規磁盤文件作爲存儲而不是註冊表或其他內容。需要一個Tcl庫來讀寫配置文件
這將是很好的分層存儲參數。我所有的參數都是字符串,數字和它們的列表。配置文件可以放在目錄中(不僅是用戶的家中)。通常,應用程序需要當前目錄中的配置文件。
你知道任何現成的Tcl庫嗎?
更常見的問題:讀取/寫入應用程序配置的「Tcl-way」是什麼?
謝謝。
我的Tcl應用程序應該讀取並存儲大量的配置參數。我想使用常規磁盤文件作爲存儲而不是註冊表或其他內容。需要一個Tcl庫來讀寫配置文件
這將是很好的分層存儲參數。我所有的參數都是字符串,數字和它們的列表。配置文件可以放在目錄中(不僅是用戶的家中)。通常,應用程序需要當前目錄中的配置文件。
你知道任何現成的Tcl庫嗎?
更常見的問題:讀取/寫入應用程序配置的「Tcl-way」是什麼?
謝謝。
tcllib包含一個包inifile用於處理windows .ini文件格式的配置文件。因爲它是tcllib的一部分,所以它應該可用於所有平臺(我剛剛檢查過,並且它在我的Solaris 8盒子上可以正常運行)。它允許您讀取和寫入.ini文件並按部分和鍵訪問配置。
如果配置不一定需要人類可讀,我建議你考慮Sqlite - 它開始是一個Tcl擴展,因此Tcl的Sqlite綁定比其他語言更成熟。
如果你不需要隨機訪問(即配置文件是不是巨大的,每個人都可以完全在一次咕嚕咕嚕),不通過外部工具需要處理,你可以只使用包含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比這更能勝任(提供對數據的隨機訪問,能夠在龐大的數據陣列上運行)。但看起來對於你的任務來說,這些工具似乎太重了。
請注意,我的示例故意選擇顯示如何存儲/恢復任意臨時變量列表,以便cf_write
過程構建要自行存儲的Tcl列表。當然,沒有人會阻止你自己創建一個,爲創建任意複雜的層次結構提供了條件。一個警告是,在這種情況下,您可能(或可能不會)面臨解構恢復列表的問題。但是如果你像我的例子那樣堅持每個元素的名稱/值對的一般規則,解構不應該很難。
分層格式的另一種選擇是tcllib [struct :: tree](http://tcllib.sourceforge.net/doc/struct_tree.html)包,與[treeql](http:// tcllib。 sourceforge.net/doc/treeql.html)包。 – schlenk
@schlenk,哦,這很有趣,感謝指針 – kostix
我寫了一個JSON序列化程序,但它確實需要一些非常令人討厭的技巧8.6。 –