程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 程序配置信息的保存

程序配置信息的保存

編輯:C語言基礎知識
    在我們編寫的每一個程序中,我們都要保存一些有用的信息,如何保存這些信息呢?比較常用的有三種方法,一種是使用注冊表,一種是使用Ini文件,還有就是使用文件。采用那種方法保存配置信息,不同的人可能有不同的習慣,這三種方法那種最適合你的程序呢,究竟那個最方便呢?
  
   一、使用注冊表
       在BCB中有個TRegistry,它提供了方便的注冊表操作,它有幾個重要的屬性和方法。如下:
       __property HKEY RootKey = {read=FRootKey, write=SetRootKey, nodefault};
       這個屬性用來設置和取得當前的根鍵。在默認情況下它的值是HKEY_CURRENT_USER。
       這個屬性是我們經常用到的。
       bool __fastcall OpenKey(const AnsiString Key, bool CanCreate);
       這個方法用來打開一個鍵,bool CanCreate是表示假如這個鍵不存在則是否創建這個鍵,true是創建。假如打開成功返回true。
       void __fastcall CloseKey(void);
       這個方法關閉當前打開的鍵,當你完成注冊表的修改後,應該調用此方法來保存您的修改。
       bool __fastcall KeyExists(const AnsiString Key);
       這個方法判定一個鍵是否存在。
       bool __fastcall ValueExists(const AnsiString Name);
       這個方法判定當前鍵下是否存在指定的數據項。
       AnsiString __fastcall ReadString(const AnsiString Name);
       這個方法從當前鍵下指定的數據項讀取一個字符串。
       void __fastcall WriteString(const AnsiString Name, const AnsiString Value);
       這個方法向當前鍵下指定的數據項寫入一個字符串。類似的函數還有ReadInteger,WriteInteger,ReadBool,WriteBool等方法,這裡就不一一列舉了,請大家看一下在線幫助就可以了,下面我舉一個使用注冊表保存和讀取程序配置信息的例子來說明如何用注冊表讀取和保存程序的配置信息。
       下面這個例子從HKEY_LOCAL_MACHINESoftwareMyInfo鍵下讀取配置信息,假如程序是第一次運行則建立這個鍵。(使用TRegistry類,需要包含Registry.hpp)
       #include <Registry.hpp>
  
       void __fastcall ReadConfig ()
       {
         TRegistry * reg = new TRegistry();
         reg->RootKey = HKEY_LOCAL_MACHINE;
         if ( reg->OpenKey ( "SoftwareMyInfo", true  ) )
         {//打開HKEY_LOCAL_MACHINESoftwareMyInfo鍵假如不存在則創建
           if ( reg->ValueExists ( "DataPath" ) )
           {//判定是否存在DataPath這個數據項,存在則讀取
             SysConfig.DataPath = reg->ReadString ( "DataPath" );
           }else{//假如不存在這個數據項則采用程序默認路徑
             SysConfig.DataPath = DefaultPath;
           }
         }
  
         reg->CloseKey();//關閉打開的鍵。
         delete reg;
       }
       下面這個例子是保存信息到注冊表,假如不存在這個鍵則創建並保存。
       void __fastcall SaveConfig ()
       {
         TRegistry * reg = new TRegistry();
         reg->RootKey = HKEY_LOCAL_MACHINE;
         if ( reg->OpenKey ( "SoftwareMyInfo", true  ) )
         {//打開HKEY_LOCAL_MACHINESoftwareMyInfo鍵假如不存在則創建
           reg->WriteString ( "DataPath", SysConfig.DataPath );
         }
         reg->CloseKey();//關閉打開的鍵並保存信息
         delete reg;
       }
       這兩個例子很簡單,其它的一些讀寫方法也和讀取和寫入String差不多,大家可以試試。
  
       使用注冊表要注重的問題。
  
           使用注冊表保存配置信息是多數軟件所采用的方法,用注冊表的優點是用戶輕易不能夠取得和修改這些配置信息,能夠有一定的安全性和隱蔽性,假如你采用二進制方式寫入的話,用戶將很難知道你保存的數據內容,這樣可以使你的數據更安全它的缺點就是你要注重在Windows的不同版本下,注冊表的結構是不同的,而且在NT和WIN2000下,假如權限不夠有些鍵系統是不答應你訪問的。再就是用戶很討厭軟件在它的注冊表裡寫
   入一些東西。這也就是流行的綠色軟件之說了。
  
   二、使用INI配置文件
  
       在BCB中有個TIniFile類,它提供了對INI文件的操作,INI文件一種通用的配置文件格式它也象注冊表一樣分鍵和數據項,下面是一個INI配置文件的內容,它有一個鍵LastConfig,在這個鍵下有一個數據項DefaultDit,在數據項後面就是這個數據項的值。
     [LastConfig]
     DefaultDir=E:xxx
     TIniFile類有幾個常用的方法給大家介紹一下:
     __fastcall TIniFile(const AnsiString FileName) : Inifiles::TCustomIniFile(FileName) { }
     這個方法創建一個INI對象,假如FileName指定的文件名不存在則自動生成此文件,FileName可以用全路徑,指定INI文件的地點,假如只有文件名沒有路徑,這個函數將到Windows系統路徑下去打開或創建。(WIN9X是Windows目錄,NT和2000是WINNT目錄)
     bool __fastcall SectionExists(const AnsiString Section);
     這個方法判定是否存在Section這個鍵。
     virtual AnsiString __fastcall ReadString(const AnsiString Section, const AnsiString Ident, const AnsiString Default);
     這個方法從INI文件中讀取一個字符串,Section是指定的鍵,Ident是指定鍵下的數據項Default是假如這個項不存在的時候的默認值。
     virtual void __fastcall WriteString(const AnsiString Section, const AnsiString Ident, const AnsiString Value);
     這個方法是向INI文件中寫入一個字符串,Senction是指定的鍵,Ident是指定的數據項,Value是要寫入的數據。同TRegistry一樣,TIniFile類還提供了讀取整型、布爾型,二進制等數據類型的讀寫方法,大家看看聯機幫助就可以了,用法基本一樣。下面就那上面的INI文件為例來說明一下如何有INI文件來保存配置信息和如何從INI文件中讀取數據。
  
     下面的例子是如何從一個INI文件中讀取配置,此配置文件保存在應用程序的目錄下,假如沒有配置,則取程序所在路徑為默認值。
  
  
     #include <inifiles.hpp>
  
     void __fastcall ReadConfig ()
     {
      //讀取配置,
       TIniFile * regKey;
       AnsiString ExePath = ExtractFileName( ParamStr ( 0 ) );
       regKey = new TIniFile ( ExePath + "TrimTxt.ini");
       DefaultDir=regKey->ReadString("LastConfig","DefaultDir",ExePath );
       delete regKey;
     }
  
     下面的例子說明如何將信息寫入INI文件
  
     void __fastcall SaveConfig ()
     {
       TIniFile * regKey;
       AnsiString ExePath = ExtractFileName( ParamStr ( 0 ) );
       regKey = new TIniFile ( ExePath + "TrimTxt.ini");
       regKey->WriteString ( "LastConfig", "DefaultDir" , DefaultDir );
       de
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved