2011-11-08 34 views
1

我的Tcl應用程序應該讀取並存儲大量的配置參數。我想使用常規磁盤文件作爲存儲而不是註冊表或其他內容。需要一個Tcl庫來讀寫配置文件

這將是很好的分層存儲參數。我所有的參數都是字符串,數字和它們的列表。配置文件可以放在目錄中(不僅是用戶的家中)。通常,應用程序需要當前目錄中的配置文件。

你知道任何現成的Tcl庫嗎?

更常見的問題:讀取/寫入應用程序配置的「Tcl-way」是什麼?

謝謝。

回答

1

tcllib包含一個包inifile用於處理windows .ini文件格式的配置文件。因爲它是tcllib的一部分,所以它應該可用於所有平臺(我剛剛檢查過,並且它在我的Solaris 8盒子上可以正常運行)。它允許您讀取和寫入.ini文件並按部分和鍵訪問配置。

2

如果配置不一定需要人類可讀,我建議你考慮Sqlite - 它開始是一個Tcl擴展,因此Tcl的Sqlite綁定比其他語言更成熟。

參見:http://www.sqlite.org/tclsqlite.html

1

如果你不需要隨機訪問(即配置文件是不是巨大的,每個人都可以完全在一次咕嚕咕嚕),不通過外部工具需要處理,你可以只使用包含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比這更能勝任(提供對數據的隨機訪問,能夠在龐大的數據陣列上運行)。但看起來對於你的任務來說,這些工具似乎太重了。

請注意,我的示例故意選擇顯示如何存儲/恢復任意臨時變量列表,以便cf_write過程構建要自行存儲的Tcl列表。當然,沒有人會阻止你自己創建一個,爲創建任意複雜的層次結構提供了條件。一個警告是,在這種情況下,您可能(或可能不會)面臨解構恢復列表的問題。但是如果你像我的例子那樣堅持每個元素的名稱/值對的一般規則,解構不應該很難。

+1

分層格式的另一種選擇是tcllib [struct :: tree](http://tcllib.sourceforge.net/doc/struct_tree.html)包,與[treeql](http:// tcllib。 sourceforge.net/doc/treeql.html)包。 – schlenk

+0

@schlenk,哦,這很有趣,感謝指針 – kostix

+0

我寫了一個JSON序列化程序,但它確實需要一些非常令人討厭的技巧8.6。 –