特定的应用程序配置的历史信息往往被存放在INI文件中,这种文件包括了几个部分,每个部分包括了键名和键值纯文本数据。在Windows系统中,注册表文件已经代替了INI文件来存储配置信息。然而,还是有很多的应用程序仍然在使用INI文件。
在Web应用程序中,配置信息往往非常复杂,这也使得配置信息在文件中的存放杂乱无章且难于维护。如果用户自己来为Web应用程序配置信息设置INI文件,则可以为这些信息提供集中式的管理,并能够对Web配置进行从前台到后台的全面更改。
INI文件常常按照如下格式包含相关配置信息:
[Section]
key=value
同样的,Windows的API提供了一些函数可以获取并存储INI 信息。其中两个函数是getPrivateProfileString()和writePrivateProfileString()。这两个函数封装了从INI文件中导出数据或将数据导出到INI文件的多个步骤。你可以在自己的INI文件中模拟相同的功能。无需使用上面所提到的INI格式,你就可以配置基于XML的INI文件。
在接下来的例子中,我将在ASP中创建一个类,该类将收集和编写配置信息的功能封装起来。此类包含了两种方法:getPrivateProfileString()和writePrivateProfileString()。通过以上两种方法,我将模拟两个Windows API函数的接口。代码如下:
Class CINI
Private m_dom
Public Function getApplicationPath()
Dim sURL
sURL = Request.ServerVariables("URL")
getApplicationPath = Mid(sURL, 1, InStr(2, sURL, "/"))
End Function
Public Function getPrivateProfileString(sDomain, sKeyName, sDefault,
sFileName)
Dim m_result
m_result = ""
If m_dom.load(sFileName) Then
Dim domain_node
Set domain_node = m_dom.selectSingleNode("//domain[@domain_name='"
& LCase(sDomain) & "']")
If domain_node Is Nothing Then
m_result = sDefault
Err.Raise vbObjectError, "", "no domain"
Else
Dim node
Set node = domain_node.selectSingleNode(sKeyName)
If node Is Nothing Then
m_result = sDefault
Err.Raise vbObjectError, "", "no node"
Else
m_result = Unescape(node.text)
End If
Set node = Nothing
End If
Set domain_node = Nothing
Else
m_result = sDefault
Err.Raise vbObjectError, "", "File Error: Cannot open or find " &
sFileName
& "."
End If
getPrivateProfileString = m_result
End Function
Public Function writePrivateProfileString(sDomain, sKeyName, sString,
sFileName)
If m_dom.load(sFileName) Then
Dim domain_node, node
Set domain_node =
m_dom.selectSingleNode("//domain[@domain_name='" & LCase(sDomain) &
"']")
If domain_node Is Nothing Then
Dim domain_attr, map
Set domain_node = m_dom.createNode(1, "domain", "")
Set domain_attr = m_dom.createNode(2, "domain_name", "")
domain_attr.text = LCase(sDomain)
Set map = domain_node.Attributes
map.setNamedItem domain_attr
Set domain_node =
m_dom.documentElement.appendChild(domain_node)
Set map = Nothing
Set domain_attr = Nothing
End If
Set node = domain_node.selectSingleNode(sKeyName)
If node Is Nothing Then
Set node = m_dom.createNode(1, sKeyName, "")
Set node = domain_node.appendChild(node)
End If
node.text = Escape(sString)
If m_dom.save(sFileName) <> 0 Then _
Err.Raise vbObjectError, "CToolbox::writePrivateProfileString(.., "
&
sFileName & ")", "Cannot save file for some reason."
Set domain_node = Nothing
Set node = Nothing
Else
Err.Raise vbObjectError, "", "File Error: Cannot open or find " &
sFileName
& "."
End If
End Function
Private Sub Class_Initialize
Set m_dom = Server.CreateObject("MSXML2.DOMDocument")
m_dom.async = False
End Sub
Private Sub Class_Terminate
Set m_dom = Nothing
End Sub
End Class