配置文件判斷有哪個介面
『壹』 linux通過什麼介面來進行網路介面操作
網路信息查看
查看網路介面信息
1.了解linux中的網路介面設備
$/sbin/ifconfig 查看所有活動網路介面信息,其中包括一個lo環回埠。
2.查看指定網路介面的信息
$/sbin/ifconfig <網路介面名稱> 查看指定介面信息。
3.查看系統中所有網路介面的信息
$/sbin/ifconfig –a 查看所有介面信息,包括非活動狀態介面。
註:普通用戶查看網路介面信息時,需要在命令前加「/sbin」,而管理員卻不用。這是由於命令搜索路徑的原因,可以通過「$echo $PATH」查看。
查看網關地址和路由信息
1、查看主機路由信息
#/route
顯示當前linux主機中的路由表信息。
#/route |grep default
在route命令的顯示結果中以「default」開始的行顯示了,主機的默認網關地址,將route命令和grep命令組合,使用過濾route命令的顯示結果只顯示默認網關地址。
2.測試與其它主機的網路鏈接
$ping 目的主機地址
使用ping命令測試與其它主機的網路鏈接。ctrl+C終止。
$ping –c <測試數據包數量> <目的主機地址>
使用ping命令發送指定數量的數據包進行網路鏈接測試。
$使用ping命令進行網路鏈接測試的技巧。
註:當ping命令測試不成功時並不能判斷當前主機到目標主機的連接是斷開的,因為有很多因素,(如網路防火牆等)可以導致網路連接正常時主機之間無法ping通。
3、測試與其它主機的網路鏈接路徑
$traceroute <目的主機地址>
traceroute命令顯示當前主機與目的主機之間經過的所,有網路節點的地址,以及當前主機到每個中間結點的連接狀態。
查看主機名稱信息
1、查看當前主機名稱
$Hostname 查看當前的主機名。
2、使用dns伺服器查詢域名
$Nslookup
交互模式:通常用於對DNS伺服器進行測試
直接模式:用於查詢某個域名對應的ip地址
使用網路命令進行網路設置
網路設置的方法
1、DHCP網路配置
$Dhclient 使用dhclient命令可以從DHCP伺服器中申請新的網路配置應用到當前主機。
註:DHCP伺服器通常提供給DHCP客戶端最基本的網路配置信息,包括:介面ip地址,默認網關,DNS
伺服器地址。
2、手工網路配置
網路介面ip地址和子網掩碼
默認網關地址
當前主機名稱
DNS伺服器地址
Ip地址配置命令
Ifconfig <網路介面名稱> network <子網掩碼>
例:# ifconfig eth0 192.168.1.222 netmask 255.255.255.0
註:手工配置linux網路只限於臨時使用,配置不保存。
擴展:# ifconfig eth0:1 10.0.0.1 netmask 255.0.0.0 一塊網卡配置多個子ip地址。
# ifconfig eth0 hw ether MAC地址 修改網卡的mac地址,
路由配置命令
1、刪除默認網關路由
$Route del default gw <默認網關地址>
2、添加默認網關路由
$Route add default gw <默認網關地址>
例:#route add default gw 192.168.1.1
主機名稱配置命令
# hostname 123
將主機暫時名稱改為123。
DNS域名解析
Nslookup
>server
顯示linux系統中使用的DNS伺服器地址,也可臨時設置生效。
修改配置文件進行網路設置
使用工具進行網路設置
# Netconfig 圖形界面設置網路,重啟network後生效。
界面中需要填寫的內容:
主機網路介面的ip地址。
網路介面的子網掩碼。
默認網關地址。
主DNS伺服器的ip地址。
網路服務啟動腳本
/etc/init.d/network 從新啟動才能生效
擴展:# /etc/rc.d/init.d/network start 啟動network
# /etc/rc.d/init.d/network stop 停止network
# /etc/rc.d/init.d/network restart 重啟network
網路介面配置文件
/etc/sysconfig/network-scripts/ifconfg-*
DEVICE=eth0 網卡編號
ONBOOT=yes 開機時是否啟動網卡。
BOOTPROTO=static 靜態ip或者DHCP動態獲取。
IPADDR=192.168.1.163 ip
NETMASK=255.255.255.0 掩碼
GATEWAY=192.168.1.1 網關
以下為動態獲取方式:
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
停止和啟動指定的網路介面
單個網路介面的配置進行修改後
Ifdown 網路介面名稱 停止某個網路介面。
Ifup 網路介面名稱 開啟某個網路介面。
註:單個網路介面的配置文件進行修改後,不必每次都從新啟動network服務使配置文件生效,可用以上命令。
擴展:對網路介面操作:
# ifconfig eth0 down 停止eth0介面
# ifconfig eth0 up 開啟eth0介面
可以連續使用
Ifdown eth0 ; ifup eth0
主機名稱配置文件
/etc/sysconfig/network
例:# vi /etc/sysconfig/network 使用vi編輯器打開主機名配置文件。
NETWORKING=yes 網路是否可用。
HOSTNAME=xxxx xxxx為新設置的主機名。
本地主機名稱解析文件
/etc/hosts
Hosts 和 DNS具有類似的主機名稱解析功能
域名伺服器配置文件
/etc/resolv.conf
最多可以設置3行,前面的生效。
『貳』 易支付怎麼配置支付介面在哪個文件
易支付配置介面,一般都在後台可以配置
當然,這個對接介面有很多種,比如支付寶、微信、網銀等等,都可以寫入進去。
『叄』 2、Mybatis使用時,配置文件與介面之間有什麼要求
配置文件中,首先開頭的DOCTYPE必須為:<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTO Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">,表明它是MyBatis的sql映射文件,其次就是namespace,必須指向你的介面
介面中建議同時使用@Mapper和@Repository註解,以保證不會翻車。
『肆』 請判斷一下這個硬碟的介面類型
西數WDCWD800BD-22LRA0這分明就是SATA一代的。
基本參數
型號80G SATA 2M(WD800BD)
容量80G
轉速7200rpm
緩存容量2M
盤體尺寸3.5寸
介面標准S-ATA
性能參數
平均尋道時間8.9ms
傳輸標准SATAII-300M
單碟容量80G
這是2007年的產品早已停產。如果你現在想仍然使用它,不是不可以,但只能當成次要硬碟備份重要文件資料用,切勿作為系統所在的主硬碟用,否則它緩慢的讀寫速度會讓整機的性能受到極大的制約。硬碟建議你購買SATA3代的,SATA3硬碟容量最低的是500GB。
而且你這老爺機明顯的內存容量極小,你應該升級到雙通道4GB,系統沿用XP。獨立顯卡建議你換成三四百元的GT640。
升級這三大硬體後,則你此老爺機的性能可有至少四倍的大幅提升。包含硬碟(330元左右)總的升級代價切勿超過1200元,否則就不值得了。那你不如直接購買全新的主機了。
『伍』 寫程序實現讀取配置文件,程序調用實現介面,並返回指定key的value值
你的配置文件是要你來寫的么?具體格式是形如:
student 2001;2002;2003
teacher 1001;1002;1003
這樣的?
如果是以上格式的,可以通過讀取配置文件,然後以數組形式處理,結果數組為key=>value的形式。
下面的代碼使用於配置文件每行key的結束以teacher 1001;1002;1003沒有分號結束的,如果有分號就表示這個key還沒結束。
//讀取文件就省了..
$config='
student 2001;2002;2003;
2004;
teacher 1001;1002;1003
';
$temp=array();
$newarr=array();
$arr=explode("\n",$config);
$count=count($arr);
for($i=0;$i<$count;$i++){
if(strlen($arr[$i])!=1){ //跳過長度小於等於1的行
if(strstr($arr[$i],' ')&&preg_match('/;|;$/i',$arr[$i])){ //以;結尾表示這個key有兩行
$newstr=str_replace("\n","",$arr[$i].$arr[$i+1]); //將下一行的字元串連接到這一行同時去除換行(不知道為啥列印結果的時候還是有換行~)
$i++; //跳過下一行沒有key的
}else{
$newstr=$arr[$i];
}
$temp=explode(' ',$newstr);
if(is_array($temp)){
$newarr[$temp['0']]=$temp['1'];
}
}
}
print_r($newarr); //newarr格式為key=>value
『陸』 spring攔截器配置文件中/*與/**的區別,還有三個方法是怎麼一回事,還有spring連接jd
/**的意思是所有文件夾及裡面的子文件夾
/*是所有文件夾,不含子文件夾
/是web項目的根目錄
比如配置自動掃描mapping.xml
<propertyname="mapperLocations"value="classpath:com/test/mapping/**/*.xml"></property>
這是掃描mapping下子目錄的.xml文件,包含了mapping目錄下和其子目錄下的.xml
<propertyname="mapperLocations"value="classpath:com/test/mapping/*/*.xml"></property>
這是掃描mapping下文件夾下的.xml文件,如果mapping包下有.xml文件是不會被掃描的,必須是在mapping目錄下的子文件夾下裡面的.xml才行
『柒』 linux 系統配置文件
Linux 中沒有一個標準的配置文件格式
Red Hat Linux 系統中大多數配置文件都在 /etc 目錄中
配置文件也分好多種呢
一。訪問文件 1./etc/host.conf 告訴網路域名伺服器如何查找主機名。(通常是 /etc/hosts,然後就是名稱伺服器;可通過 netconf 對其進行更改)
2./etc/hosts 包含(本地網路中)已知主機的一個列表。如果系統的 IP 不是動態生成,就可以使用它。對於簡單的主機名解析(點分表示法),在請求 DNS 或 NIS 網路名稱伺服器之前,/etc/hosts.conf 通常會告訴解析程序先查看這里。
3./etc/hosts.allow 請參閱 hosts_access 的聯機幫助頁。至少由 tcpd 讀取。
4./etc/hosts.deny 請參閱 hosts_access 的聯機幫助頁。至少由 tcpd 讀取。
二。引導和登錄/注銷
1./etc/issue & /etc/issue.net 這些文件由 mingetty(和類似的程序)讀取,用來向從終端(issue)或通過 telnet 會話(issue.net)連接的用戶顯示一個「welcome」字元串。它們包括幾行聲明 Red Hat 版本號、名稱和內核 ID 的信息。它們由 rc.local 使用。
2./etc/redhat-release 包括一行聲明 Red Hat 版本號和名稱的信息。由 rc.local 使用。
3./etc/rc.d/rc 通常在所有運行級別運行,級別作為參數傳送。例如,要以圖形(Graphics)模式(X-Server)引導機器,請在命令行運行下面的命令: init 5 。運行級別 5 表示以圖形模式引導系統。
4./etc/rc.d/rc.local 非正式的。可以從 rc、rc.sysinit 或 /etc/inittab 調用。
5./etc/rc.d/rc.sysinit 通常是所有運行級別的第一個腳本。
6./etc/rc.d/rc/rcX.d 從 rc 運行的腳本( X 表示 1 到 5 之間的任意數字)。這些目錄是特定「運行級別」的目錄。當系統啟動時,它會識別要啟動的運行級別,然後調用該運行級別的特定目錄中存在的所有啟動腳本。例如,系統啟動時通常會在引導消息之後顯示「entering run-level 3」的消息;這意味著 7./etc/rc.d/rc3.d/ 目錄中的所有初始化腳本都將被調用。
三。文件系統
內核提供了一個介面,用來顯示一些它的數據結構,這些數據結構對於決定諸如使用的中斷、初始化的設備和內存統計信息之類的系統參數可能很有用。這個介面是作為一個獨立但虛擬的文件系統提供的,稱為 /proc 文件系統。很多系統實用程序都使用這個文件系統中存在的值來顯示系統統計信息。例如,/proc/moles 文件列舉系統中當前載入的模塊。lsmod 命令讀取此信息,然後將其以人們可以看懂的格式顯示出來。下面表格中指定的 mtab 文件以同樣的方式讀取包含當前安裝的文件系統的 /proc/mount 文件。
/etc/mtab 這將隨著 /proc/mount 文件的改變而不斷改變。換句話說,文件系統被安裝和卸載時,改變會立即反映到此文件中。
/etc/fstab 列舉計算機當前「可以安裝」的文件系統。這非常重要,因為計算機引導時將運行 mount -a 命令,該命令負責安裝 fstab 的倒數第二列中帶有「1」標記的每一個文件系統。
/etc/mtools.conf DOS 類型的文件系統上所有操作(創建目錄、復制、格式化等等)的配置。
四。系統管理
/etc/group 包含有效的組名稱和指定組中包括的用戶。單一用戶如果執行多個任務,可以存在於多個組中。例如,如果一個「用戶」是「project 1」工程組的成員,同時也是管理員,那麼在 group 文件中他的條目看起來就會是這樣的: user: * : group-id : project1
/etc/nologin 如果有 /etc/nologin 文件存在,login(1) 將只允許 root 用戶進行訪問。它將對其它用戶顯示此文件的內容並拒絕其登錄。
etc/passwd 請參閱「man passwd」。它包含一些用戶帳號信息,包括密碼(如果未被 shadow 程序加密過)。
/etc/rpmrc rpm 命令配置。所有的 rpm 命令行選項都可以在這個文件中一起設置,這樣,當任何 rpm 命令在該系統中運行時,所有的選項都會全局適用。
/etc/securetty 包含設備名稱,由 tty 行組成(每行一個名稱,不包括前面的 /dev/),root 用戶在這里被允許登錄。
/etc/usertty
/etc/shadow 包含加密後的用戶帳號密碼信息,還可以包括密碼時效信息。包括的欄位有:
登錄名
加密後的密碼
從 1970 年 1 月 1 日到密碼最後一次被更改的天數
距密碼可以更改之前的天數
距密碼必須更改之前的天數
密碼到期前用戶被警告的天數
密碼到期後帳戶被禁用的天數
從 1970 年 1 月 1 日到帳號被禁用的天數
/etc/shells 包含系統可用的可能的「shell」的列表。
/etc/motd 每日消息;在管理員希望向 Linux 伺服器的所有用戶傳達某個消息時使用。
五。聯網
/etc/gated.conf gated 的配置。只能被 gated 守護進程所使用。
/etc/gated.version 包含 gated 守護進程的版本號。
/etc/gateway 由 routed 守護進程可選地使用。
/etc/networks 列舉從機器所連接的網路可以訪問的網路名和網路地址。通過路由命令使用。允許使用網路名稱。
/etc/protocols 列舉當前可用的協議。請參閱 NAG(網路管理員指南,Network Administrators Guide)和聯機幫助頁。 C 介面是 getprotoent。絕不能更改。
/etc/resolv.conf 在程序請求「解析」一個 IP 地址時告訴內核應該查詢哪個名稱伺服器。
/etc/rpc 包含 RPC 指令/規則,這些指令/規則可以在 NFS 調用、遠程文件系統安裝等中使用。
/etc/exports 要導出的文件系統(NFS)和對它的許可權。
/etc/services 將網路服務名轉換為埠號/協議。由 inetd、telnet、tcpmp 和一些其它程序讀取。有一些 C 訪問常式。
/etc/inetd.conf inetd 的配置文件。請參閱 inetd 聯機幫助頁。包含每個網路服務的條目,inetd 必須為這些網路服務控制守護進程或其它服務。注意,服務將會運行,但在 /etc/services 中將它們注釋掉了,這樣即使這些服務在運行也將不可用。格式為:<service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
/etc/sendmail.cf 郵件程序 sendmail 的配置文件。比較隱晦,很難理解。
/etc/sysconfig/network 指出 NETWORKING=yes 或 no。至少由 rc.sysinit 讀取。
/etc/sysconfig/network-scripts/if* Red Hat 網路配置腳本。
六。系統命令
系統命令要獨佔地控制系統,並讓一切正常工作。所有如 login(完成控制台用戶身份驗證階段)或 bash(提供用戶和計算機之間交互)之類的程序都是系統命令。因此,和它們有關的文件也特別重要。這一類別中有下列令用戶和管理員感興趣的文件。
/etc/lilo.conf 包含系統的預設引導命令行參數,還有啟動時使用的不同映象。您在 LILO 引導提示的時候按 Tab 鍵就可以看到這個列表。
/etc/logrotate.conf 維護 /var/log 目錄中的日誌文件。
/etc/identd.conf identd 是一個伺服器,它按照 RFC 1413 文檔中指定的方式實現 TCP/IP 提議的標准 IDENT 用戶身份識別協議。identd 的操作原理是查找特定 TCP/IP 連接並返回擁有此連接的進程的用戶名。作為選擇,它也可以返回其它信息,而不是用戶名。請參閱 identd 聯機幫助頁。
/etc/ld.so.conf 「動態鏈接程序」(Dynamic Linker)的配置。
/etc/inittab 按年代來講,這是 UNIX 中第一個配置文件。在一台 UNIX 機器打開之後啟動的第一個程序是 init,它知道該啟動什麼,這是由於 inittab 的存在。在運行級別改變時,init 讀取 inittab,然後控制主進程的啟動。
/etc/termcap 一個資料庫,包含所有可能的終端類型以及這些終端的性能。
七。守護進程
守護進程是一種運行在非交互模式下的程序。一般來說,守護進程任務是和聯網區域有關的:它們等待連接,以便通過連接提供服務。Linux 可以使用從 Web 伺服器到 ftp 伺服器的很多守護進程。
/etc/syslogd.conf syslogd 守護進程的配置文件。syslogd 是一種守護進程,它負責記錄(寫到磁碟)從其它程序發送到系統的消息。這個服務尤其常被某些守護進程所使用,這些守護進程不會有另外的方法來發出可能有問題存在的信號或向用戶發送消息。
/etc/httpd.conf Web 伺服器 Apache 的配置文件。這個文件一般不在 /etc 中。它可能在 /usr/local/httpd/conf/ 或 /etc/httpd/conf/ 中,但是要確定它的位置,您還需要檢查特定的 Apache 安裝信息。
/etc/conf.moles or /etc/moles.conf kerneld 的配置文件。有意思的是,kerneld 並不是「作為守護進程的」內核。它其實是一種在需要時負責「快速」載入附加內核模塊的守護進程。
八。更改配置文件
在更改配置文件時,如果程序不是由系統管理員或內核控制的,就要確保重新啟動過使用該配置的程序。普通用戶通常沒有啟動或停止系統程序和/或守護進程的許可權。
參考網站:http://www.ibm.com/developerworks/cn/linux/management/configuration/index.html
『捌』 求操作系統介面:Windows命令介面 設計(C++編的) 謝謝
基於XML的配置文件訪問介面設計和實現(1)
目錄
摘要
配置文件結構
XmlConfigReader類的實現
XmlConfigReader類的使用
摘要
在進行程序開發過程中,經常要將一些程序設置/使用的信息儲存起來.由於這些信息和程序的設置/使用相關,與程序有相當的獨立性,所以不可能硬編碼到程序中.在這個時候我們選擇使用基於Xml的配置文件進行存儲.Microsoft的.NET Framework提供了一系列的基於.Config文件的讀取的類,如System.Configuration 命名空間提供的AppSettings等類.但是此命名空間提供的類只能對配置文件進行讀取,不能進行設置.所以在這里,我們實現自己的一個基於Xml的配置文件的類XmlConfigReader/XmlConfigWriter.
配置文件的結構
為了達到與原有的,系統自帶的(.Config)配置文件的兼容性,我們選擇使用類似.Config 文件的結構.示例如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="TimeOut" value="5000"/>
<add key="UserName" value="client7" />
<add key="FileServerPort" value="8050" />
<add key="SpliteCharsForCMD" value=":"/>
<add key="SpliteCharsForItem" value=";"/>
<add key="SpliteCharsForSubItem" value=","/>
</appSettings>
<SockBaseSettings>
<addd key="ServerIP" value="localhost"/>
</SockBaseSettings>
</configuration>
所有的要設置的信息都放在Configuration節點的子節點(如appSettings/SockBaseSettings)的子節點中,這種結構有助於將不同的設置的信息進行歸類/統一.結構和系統的.Config結構基本類似.這樣就可以很方便的將此自定義的結構轉為.Config文件.
XmlConfigReader類的實現
現在文件的基本結構已完成了,現在就開始編碼,完成XmlConfigReader.
由於配置文件是以文件的形式放在硬碟上面的,所以這個XmlConfigReader類在解析Xml文件前得得到文件的路徑.
public class XmlConfigReader
{
private string _filepath;
public XmlConfigReader(string filepath){
_filepath = Path.GetFullPath(filepath).ToUpper();
}
}
好,現在可以得到文件路徑了.然後就是對配置文件進行解析了.在這里,我們選用.NET Framework提供的System.Xml命名空間中的輕量級的XmlTextReader來對配置文件進行解析.對應的XmlConfigReader中的函數定義如下:
public string Process(string sectionName,string key){
bool inConfiguration = false;
bool inSection = false;
string values;
XmlTextReader reader = new XmlTextReader(_filepath);
while( reader.Read()){
if( reader.IsStartElement()){
if( reader.Prefix == String.Empty)
{
if( reader.LocalName == "configuration")
{
inConfiguration = true;
}
else if( inConfiguration == true){
if( reader.LocalName == sectionName){
inSection = true;
}
else if( inSection && reader.LocalName == "add"){
if( reader.GetAttribute("key") == null || reader.GetAttribute("value") == null)
{
throw new Exception(sectionName + " key or value is null");
}
if( reader.GetAttribute("key") == key){
values = reader.GetAttribute("value");
break;
}
}
}
}
}
}
reader.Close();
return values;
}
通過XmlTextReader的Read()函數對Xml文件中的節點進行遍歷.同時先判斷是否屬於configuration節點中,再判斷是否屬於相應的sectionName中.只有在這兩部分同時成立的時候才判斷是否是相應的Key.如果是,得到其Value,並返回.
XmlConfigReader類的使用
好了,現在通過XmlConfigReader可以對配置文件進行讀取了,這里我們看看實際使用的代碼:
public class TestXmlConfigReader{
public void GetValues(){
XmlConfigReader reader = new XmlConfigReader(@"AppConfig.xml");
String Temp;
// Get appSettings username value
Temp = reader.Process("appSettings",」UserName");
// Get SockBaseSettings ServerIP value
Temp = Reader.Process(「SockBaseSettings」,」ServerIP」);
}
}
總結
通過XmlConfigReader類,我們可以很方便的自定義我們自己的配置文件.
基於XML的配置文件訪問介面設計和實現(2)
目錄
摘要
XmlConfigWriter類的實現
XmlConfigWriter類的使用
摘要
在進行程序開發過程中,經常要將一些程序設置/使用的信息儲存起來.由於這些信息和程序的設置/使用相關,與程序有相當的獨立性,所以不可能硬編碼到程序中.在這個時候我們選擇使用基於Xml的配置文件進行存儲.Microsoft的.NET Framework提供了一系列的基於.Config文件的讀取的類,如System.Configuration 命名空間提供的AppSettings等類.但是此命名空間提供的類只能對配置文件進行讀取,不能進行設置.所以在這里,我們實現自己的一個基於Xml的配置文件的類XmlConfigReader/XmlConfigWriter.
XmlConfigWriter類的實現
由於要對配置文件進行寫入,而且可能寫入的次數比較多.所以這里我們不使用輕便的XmlTextWriter,使用XmlDocument.XmlDocument可以在內存中修改所有的Xml的節點,只有等到顯式的調用Save函數的時候才會保存Xml文件.在有大量修改的時候,性能要好一些.
同樣的,先實現XmlConfigWriter的構造函數
public class XmlConfigWriter
{
private string _filepath;
private XmlDocument doc ;
public XmlConfigWriter(string filepath)
{
_filepath = Path.GetFullPath(filepath);
doc =new XmlDocument();
doc.Load(_filepath);
}
}
通過構造函數,將配置文件的路徑傳進去,同時調用XmlDocument的Load方法,將此文件載入到內存中.
這里我們使用的是XmlDocument類.它實現 W3C 文檔對象模型 (DOM) 級別 1 核心 (Level 1 Core) 和核心 DOM 級別 2 (Core DOM Level 2)。DOM 是 XML 文檔的內存中(緩存)樹狀表示形式,允許對該文檔的導航和編輯.通過XmlDocument,我們就可以很方便的在內存中直接操作節點.
.對配置文件的寫入,不外忽三種,一種就是新插入一個節點,一種就是對現有節點的修改,最後一個就是刪除現有的節點.我們首先從插入開始入手.代碼如下:
private XmlNode CreateXmlNode(string localname){
return doc.CreateNode(XmlNodeType.Element,localname,"");
}
private XmlAttribute CreateXmlAttribute(string localname){
return doc.CreateAttribute("",localname,"");
}
public void AddSection(string section){
XmlNode secNode = doc.SelectSingleNode("/configuration/"+section);
if(secNode != null){
return;
}
doc.DocumentElement.AppendChild(CreateNode(section));
}
public void AddKey(string section,string key,string value){
XmlNode secNode = doc.SelectSingleNode("/configuration/"+section);
if( doc.SelectSingleNode("/configuration/" + section + "/add[@key=\"" + key + "\"]") != null)
{
return;
}
XmlNode chi = CreateXmlNode("add");
XmlAttribute att = CreateXmlAttribute("key");
att.Value = key;
chi.Attributes.Append(att);
att = CreateXmlAttribute("value");
att.Value = value;
chi.Attributes.Append(att);
secNode.AppendChild(chi);
}
對於配置文件的插入,有兩種情況,一個就是插入一個新的Section節點(即appSettings/SockBaseSettings這樣的節點),一個就是在當前的Section節點下面插入一個新的add節點.在上面的代碼中,對於插入節點的操作,都是首先通過doc的SelectSingleNode函數來判斷是否已存在此同名節點,如果存在,則直接return,避免創建同名的節點.但是,由於在最終使用的add節點是分屬於不同的Section節點的,所以只是判斷在同一個Section節點下面的此節點不能同名.
如果不存在同名的節點,就通過secNode.AppentChild函數將此新建的(通過CreateXmlNode函數)節點加入到doc對象中.同時,對於add節點,通過CreateXmlAttribute函數及XmNode.Attributes.Appent函數將其key / value屬性加入到此節點中.這樣,插入操作就完成了.
接著我們來完成刪除操作.刪除操作直接通過XmlDocument的SelectSingleNode得到目標節點的父節點,再通過XmlNode.RemoveChild操作將其刪除.代碼如下:
public void DeleteSection(string section){
XmlNode secNode = doc.SelectSingleNode("/configuration/"+section);
doc.DocumentElement.RemoveChild(secNode);
}
public void DeleteKey(string section,string key){
XmlNode secNode = doc.SelectSingleNode("/configuration/" + section + "/add[@key=\"" + key + "\"]");
if(secNode != null)
{
secNode.ParentNode.RemoveChild(secNode);
}
}
現在開始修改操作.對於修改操作,思路是這樣的,首先通過XmlDocument的SelectSingleNode搜索,看是否有滿足條件的節點.如果沒有,直接return,如果存在,則分兩情況.對於add節點,只是直接修改其value屬性.對於Section節點,則是通過遍歷把其下所有的子節點(add節點)得到,再把此Section節點刪除,再生成一個新的節點(這個新的節點的Name就為要設置的值),再把得到的所有子節點再賦給這個新的節點.代碼如下:
public void ModifySection(string oldSection,string newSection){
XmlNode secNode = doc.SelectSingleNode("/configuration/"+oldSection);
XmlNodeList list = secNode.ChildNodes;
doc.DocumentElement.RemoveChild(secNode);
secNode = doc.CreateNode(XmlNodeType.Element,newSection,"");
foreach( XmlNode i in list){
secNode.AppendChild(i);
}
doc.DocumentElement.AppendChild(secNode);
}
public void ModifyKey(string section,string key,string value){
XmlNode secNode = doc.SelectSingleNode("/configuration/" + section + "/add[@key=\"" + key + "\"]");
if(secNode != null)
{
secNode.Attributes["value"].Value = value;
}
}
好了,插入,修改,刪除操作到現在基本完成了,但是現在還只是在內存中進行操作,還不是對實際的文件進行操作.這個時候,我們就還得通過XmlDocument.Save函數把內存中修改好的Xml文件寫入到文件中去.代碼如下:
public void Save(){
doc.Save(_filepath);
}
public void Save(string filepath)
{
doc.Save(filepath);
}
XmlConfigWriter類的使用
使用方法很簡單.先產生一個XmlConfigWriter對象,通過構造函數把配置文件傳進去,再通過Add/Modify/Delete等函數進行操作.代碼如下:
XmlConfigWriter Writer = new XmlConfigWriter(@」appconfig.xml」);
Writer.AddSection(「appSettings」);
Writer.AddKey(「appSettings」,」ServerIP」,」localhost」);
Writer.ModifyKey(「appSettings」,」ServerIP」,」127.0.0.1」);
Writer.ModifySection(「appSettings」,」SockBaseSettings」);
Writer.DeleteKey(「SockBaseSettings」,」ServerIP」);
Writer.DeleteSection(「SockBaseSettings」);
Writer.Save();
總結
通過編寫XmlConfigWriter,我們學會使用XmlDocument的使用.
基於XML的配置文件訪問介面設計和實現(3)
目錄
摘要
增加緩存支持
增加配置文件監視
增加ConfigurationSettings類
摘要
前面的兩篇中,我們實現了XmlConfigReader和XmlConfigWriter的基本功能.由於XmlConfigReader的實現方式是每請求一次,就去解析配置文件一次,性能很低下.同時,為了更方便使用,我們增加一個ConfigurationSettings類,用來調用XmlConfigReader和XmlConfigWriter,使之用起來和System.Configuration中的類使用方式一樣.
增加緩存支持
由於XmlConfigReader的實現方式是請求一次,解析配置文件一次,而且配置文件的信息在程序運行的時會大量使用,這樣子顯然效率太低.因此,這里就要使用到緩存.
緩存,其實就相當於一個靜態的變數,在整個程序運行時是唯一的,通過這樣的一個變數,把信息存儲到這個變數裡面,在程序的其它地方就可以直接得到這個信息了.從而避免了頻繁的解析配置文件.這里,我們選擇使用Hashtable做為緩存變數.
在MSDN中,我們可以查到System.Configuration命名空間中的AppSettings類返回的是一個NameValueCollection(Key/Value鍵值對).為了方便使用,我們將配置文件解析後的信息也存成NameValueCollection這樣的集合.
這樣定義好了後,對於Hashtable中的Key設置為Section節點的名字(appSettings/SockBaseSettings),其Value值即為此節點的所有子節點的NameValueCollection類的對象.
修改代碼.給XmlConfigReader增加一個靜態Hashtable變數,並修改相關函數.把得到的信息直接以NameValueCollection的形式存入到此Hashtable中.
private static Hashtable confTypes = new Hashtable();
private string rootname;
public void Process(){
XmlTextReader reader = new XmlTextReader(_filepath);
while( reader.Read()){
if( reader.IsStartElement()){
#region Analyze the files
if( reader.Prefix == String.Empty)
{
if( reader.LocalName == "configuration")
{
inConfiguration = true;
}
else if( inConfiguration == true){
if(reader.LocalName == "add")
{
if( reader.GetAttribute("key") == null || reader.GetAttribute("value") == null)
{
throw new Exception(rootname + " key or value is null");
}
AddKey(tables,reader.GetAttribute("key"),reader.GetAttribute("value"));
}
else
{
rootname = reader.LocalName;
}
}
}
#endregion
}
else if ( reader.LocalName == "configuration"){
inConfiguration = false;
}
}
reader.Close();
}
private void AddKey(string key,string value){
NameValueCollection collection ;
if(confTypes.ContainsKey( rootname )){
collection = (NameValueCollection) confTypes [rootname];
}
else{
lock(confTypes.SyncRoot){
collection = new NameValueCollection();
confTypes.Add( rootname,collection);
}
}
collection.Add(key,value);
}
上面代碼中,我們修改了Process函數.把原來的直接return結果的地方改成調用AddKey函數.通過一個類成員 rootname臨時儲存當前的SectionName,通過AddKey把得到的Key/Value加入到Hashtable中.
現在這樣修改後,就不能直接通過Process得到我們想到得到的Key的Value了.所以我們再寫一個函數,
public NameValueCollection GetCollection(string SectionName){
if( confTypes.ContainsKey(SectionName)){
return (NameValueCollection)confTypes[SectionName];
}
else{
throw new Exception(confName + " is not found in XmlConfiguration files");
}
}
這里,我們直接通過SectionName得到此節點所有的子節點的NameValueCollection集合.這樣,我們就可以得到我們想要的值了.
增加配置文件監視
上面的代碼實現了配置文件的緩存.大大提高了靈活性.但是存在一個問題,就是,如果配置文件修改了,這個緩存不會自動更新.
要解決這個問題,我們得使用FileSystemWatcher這個類,用來訂閱文件修改消息,進而更新緩存.由於在第一次解析前就要把此配置文件加入到監視文件表中,所以我們修改XmlConfigReader,增加一個靜態的FileSystemWatcher,用來保存監視文件的對象,增加一個靜態的Bool值表明是否修改過.再修改構造函數,使配置文件在一開始就加入到監視列表中.代碼如下:
Private static FileSystemWatcher watch = new FileSystemWatcher();
Private static bool isModify = true;
public XmlConfigReader(string filepath){
_filepath = Path.GetFullPath(filepath).ToUpper();
watch.IncludeSubdirectories = false;
watch.Path = Path.GetDirectoryName(filepath);
watch.NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite;
watch.Filter = Path.GetFileName(filepath);
watch.Changed += new FileSystemEventHandler(Change_Even);
watch.EnableRaisingEvents = true;
}
由於是通過事件機制實現文件修改通知的,所以我們還要實現Chane_Even這個函數,通過這個函數修改isModify的值.
private void Change_Even(object sender, FileSystemEventArgs e){
isModify = true;
}
這樣子,對於配置文件的監視的代碼就完成了,現在就是修改我們的GetCollection代碼的時候了.
修改後的代碼如下:
public NameValueCollection GetCollection(string SectionName){
if( isModify ){
lock(confTypes.SyncRoot){
confTypes.Clear();
Process();
}
isModify = false;
}
if( confTypes.ContainsKey(SectionName)){
return (NameValueCollection)confTypes[SectionName];
}
else{
throw new Exception(confName + " is not found in XmlConfiguration files");
}
}
到現在,整個XmlConfigReader的代碼已完成了,可以實現對文件的監視,從而動態修改緩存中的值.
增加ConfigurationSettings類
為了便於使用,我們增加了一個ConfigurationSettings的類,使用他的用法和System.Configuration命名空間中的類的用法一樣.代碼定義如下:
public class ConfigurationSettings : XmlConfigWriter
{
private static string _filepath = @"AppConfig.xml";
public static string DefaultFilePath
private static XmlConfigReader reader;
{
get{return _filepath;}
set{_filepath = Path.GetFullPath(value);}
}
public static NameValueCollection AppSettings
{
get{
if( reader == null){
reader = new XmlConfigReader(DefaultFilePath);
}
return reader.GetCollection("appSettings");
}
}
public static NameValueCollection GetConfig(string sectionName){
get{
if( reader == null){
reader = new XmlConfigReader(DefaultFilePath);
}
return reader.GetCollection(sectionName);
}
}