打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
VB与INI文件

2008-06-08 16:38:48

ini专题续 -用 VB 写一个类读写 INI 文件

用 VB 写一个类读写 INI 文件

边城狂人

VB,vb.net (2002-03-20 20:34:51)

-------------------------------------------------------------------------

-------

用 VB 写一个类读写 INI 文件
---------------------------
边城狂人
========

    INI 文件是什么样子?——不会吧,这都不知道。INI 文件就是 Windows 中常见

的以 .ini 为扩展名的文件,其内部格式和各部分的名称如下:

[Section1]
Key1=Value1
Key2=Value2
Key3=Vlaue3

[Section2]
Key1=Value1
Key2=Value5
Key4=Value4
Key5=...

...

    INI 文件中分若干个段 (Section),每个段中有若干个键 (Key) 值 (Value) 对

。一个键值对保存一个信息;段则将属性类似的一些键值对组织在一起。同一个段中不

能出现两次以上同样的键,但不同的段中可以出现相同的键。

    现在明白了吗?要是还不明白,就到 Windows 里找两个 INI 文件看看,文本编辑

器就可以打开的。明白了 INI 文件就要开始学习怎样在 VB 中读写 INI 了。

    VB 读写 INI 文件,难吗?不难,因为 Windows 已经为我们做好了一切,我们只

需要调用它的 API 函数就可以了。为了读写 INI 文件,我们可能用到以下 API 函数

    GetPrivateProfileInt
    GetPrivateProfileString
    WritePrivateProfileString

    其中 WritePrivateProfileString 是用来向 INI 文件写信息的,而

GetPrivateProfileInt 和 GetPrivateProfileString 则是用来从 INI 文件中读信息

的,前者用于读取整型数据,后者则用于读取字符串型数据。

    上述三个 API 函数在 VB 中的申明和说明如下:

Private Declare Function GetPrivateProfileInt Lib "kernel32" _
Alias "GetPrivateProfileIntA" ( _       ' 返回所读取的长整型值
    ByVal lpApplicationName As String, _    ' 要读取的段 (Section) 名称
    ByVal lpKeyName As String, _            ' 要读取的的键 (Key) 名称
    ByVal nDefault As Long, _               ' 指定默认值,如果读取时出错,

则返回该值
    ByVal lpFileName As String) As Long     ' 指定要读的 INI 文件名

Private Declare Function GetPrivateProfileString Lib "kernel32" _
Alias "GetPrivateProfileStringA" ( _    ' 返回所读取的字符串值的真实长度
    ByVal lpApplicationName As String, _    ' 要读取的段 (Section) 名称
    ByVal lpKeyName As Any, _               ' 要读取的的键 (Key) 名称
    ByVal lpDefault As String, _            ' 指定默认值,如果读取时出错,

则返回该值
    ByVal lpReturnedString As String, _     ' 指定接收返回值的字符串变量
    ByVal nSize As Long, _                  ' 指定允许字符串值的最大长度
    ByVal lpFileName As String) As Long     ' 指定要读的 INI 文件名

Private Declare Function WritePrivateProfileString Lib "kernel32" _
Alias "WritePrivateProfileStringA" ( _  ' 如果成功返回非 0 值,失败返回 0
    ByVal lpApplicationName As String, _    ' 要写入的段 (Section) 名称
    ByVal lpKeyName As Any, _               ' 要写入的的键 (Key) 名称
    ByVal lpString As Any, _                ' 要写入的值 (Value),以字符串

表示
    ByVal lpFileName As String) As Long     ' 指定要写的 INI 文件名

    我们的目的是要在 VB 中写一个读写 INI 文件的类,所以在 VB 中新建一个工程

,并添加一个类模块 (Class Module),命令类为 CIniFile,并且将上面的申明添加到

类模块中。然后开始为类添加属性和方法。

    从上面的注释说明中,我们可以知道,每次调三个 API 之一都需要指定 INI 文件

名。而在我们的 CIniFile 的每一个实例中,应该始终访问同一个 INI 文件,所以属

性之一就是文件名:

    Private IniFileName As String

    另外,调用 API 的过程中可能会出现错误,那么 CIniFile 应该能提供错误信息

,所以定义一个保存错误信息的变量作为 CIniFile 的第二个属性

    Public ErrorMsg As String

    由于访问什么段、什么键以及写入什么值都可以通过参数的形式传递给方法,而获

取的值也都可以通过方法的返回值得以,所以不再需要其它属性了。不过在定义方法之

前还需要对属性进行初始化:

Private Sub Class_Initialize()
    IniFileName = vbNullString
    ErrorMsg = vbNullString
End Sub

    为了指定 INI 文件名给 CIniFile,需要定义一个方法:

Public Sub SpecifyIni(FilePathName)
    IniFileName = Trim(FilePathName)
End Sub

    在每次读写值之前还需要先判断是否已经指定了 INI 文件名,不然读什么写什么啊

Private Function NoIniFile() As Boolean
    NoIniFile = True
    If IniFileName = vbNullString Then
        ErrorMsg = "没有指定 INI 文件"
        Exit Function
    End If
    ErrorMsg = vbNullString
    NoIniFile = False
End Function

    准备工作完成,现在才是重头戏,读写 INI 文件。似乎“写”要简单一些,就先“

写”吧:

Public Function WriteString(Section As String, key As String, Value As

String) As Boolean
    WriteString = False
    If NoIniFile() Then
        Exit Function
    End If
    If WritePrivateProfileString(Section, key, Value, IniFileName) = 0

Then
        ErrorMsg = "写入失败"
        Exit Function
    End If
    WriteString = True
End Function

    该方法在 INI 文件中写入一个键值,成功返回 True,失败返回 False。根据

WritePrivateProfileString 的需要,除了文件名这一参数不用提供之外,需要提供段

名、键名和值三个参数,而且这三个参数当然来自用户。而

WritePrivateProfileString 是通过返回值是否为 0 来判断是否成功的,所以可以通

过判断 WritePrivateProfileString 的返回值是否非 0 来返回 True 或 False。

    而读 INI 就要稍稍麻烦一点了,两个读取 INI 文件的的函数中,读取字符串那个

虽然参数多些,但实现起来却更简单,所以,先写这个:

Public Function ReadString(Section As String, key As String, Size As

Long) As String
    Dim ReturnStr As String
    Dim ReturnLng As Long
    ReadString = vbNullString
    If NoIniFile() Then
        Exit Function
    End If
    ReturnStr = Space(Size)
    ReturnLng = GetPrivateProfileString(Section, key, vbNullString,

ReturnStr, Size, IniFileName)
    ReadString = Left(ReturnStr, ReturnLng)
End Function

    这个方法在 INI 文件中读取一个键值,作为字符串返回。如果参数 Size 给定的

大小不够,将不能返回完整的值串,但不会有任何提示。

    写这个函数的关键在 ReturnStr 的初始化和取值上。VB 中是不需要对字符串进行

初始化的,也不需要分配空间。但是这里如果不将它初始化为一个足够长的字符串,就

不能正确返回结果。这和 C 语言的字符串有关,就不多说了。ReturnStr 的取值也需要

有趣,要使用 Left() 函数将其截断。如果不截断,取得的结果字符串就会有 Size 那

么长,除了取得的值以外,其余部分都是用空格填充的。其原因与前面一点相同,与 C

语言的字符串有关。当然 Left() 函数也可以使用 Trim() 代替,效果是一样的。

    最后我们不得不面对这个最麻烦的 ReadInt 方法了。它为什么麻烦呢?看看现在的

函数定义就知道了:

Public Function ReadInt(Section As String, key As String) As Long
    Dim ReturnLng As Long
    ReadInt = 0
    ReturnLng = GetPrivateProfileInt(Section, key, 0, IniFileName)
    If ReturnLng = 0 Then
        ReturnLng = GetPrivateProfileInt(Section, key, 1, IniFileName)
        If ReturnLng = 1 Then
            ErrorMsg = "不能读取"
            Exit Function
        End If
    End If
    ReadInt = ReturnLng
End Function

    这个方法在 INI 文件中读取一个整数值,失败时返回 0。考虑到某些键的值也可能

为 0,故应结合 ErrorMsg 判断是否成功。

    这个方法中调用了两次 GetPrivateProfileInt,为什么要这样呢?因为

GetPrivateProfileInt 如果成功则返回取得的值,如果不成功则返回给定的默认值。

这样就会出现一种情况:如果我给的默认值是 0,GetPrivateProfileInt 函数取得的

值也是 0,那么它是成功还是失败呢?同样,如果我给的默认值是

1,GetPrivateProfileInt 函数取得的值也是 1,那就是成功还是失败呢?既然一次取

值无法判断,那就多取一次,第一次设定默认值为 0,第二次设定默认值为 1,INI 文

件的中值不会跟着我的默认值变吧?!虽然这样麻烦一些,但毕竟把问题解决了。

    自此,我们终于把一个 CIniFile 写完了——现在读写 INI 文件再也不需要像写

CIniFile 一样考虑许多东西了,CIniFile 已经帮我们做了。

- 作者: simon_211 2005年06月2日, 星期四 13:08  回复(0) |  引用(0) 加入博采

 在VB应用程序中使用INI文件的一点体会

在VB应用程序中使用INI文件的一点体会 

   摘要 结合实例介绍了在VB中调用Windows API函数操作初始化文件的方法和优点


关键词  VB Windows API INI文件

一、INI文件概述

  Windows INI文件,可解释为Windows初始化文件。它是一种专门用来保存应用程序

初始化信息和运行环境信息的文本文件。例如Windows

3.1中两个著名的INI文件win.ini和system.ini就在Windows启动时定义了Windows环境

中鼠标响应速度、使用的外壳(shell)程序等设置。Windows系统附带的许多应用程序也

都有自己的INI文件,例如控制面板的INI 文件为control.ini,它也同样定义了控制面板

的有关设置。ini文件是一种文本文件,它可以通过Notepad等文本编辑器进行编辑。ini

文件具有特定的格式。一个INI文件是由若干个段(section)组成的,每个段中包含若干关

键字(key)及相应的值(value)。段的格式如下:

[SectionName]
KeyName=Value

其中SectionName和KeyName分别是段名和关键字名,Value为关键字对应的设定值。需要

加以注意的是:

(1)段名必须加以"["和"]",且"["必须在屏幕的第一列;
(2)关键字名也必须从屏幕的第一列开始书写,且后面必须紧跟"=";
(3)可以对文件加以注释,每行注释须以";"开头。

  在Windows中,可以通过手工编辑INI 文件来改变应用程序设置。如要想将Windows

的外壳程序改为文件管理器,则可将system.ini中[boot]段下的"shell=progman.exe"

改为"shell=winfile.exe"。有些设置也可以直接在应用程序界面上更改,但实际上也是

通过修改INI文件来保存这些修改的。

二、在VB中操作INI文件的几个Windows API函数

  在开发应用程序时,我们可以创建应用程序自己的INI文件,通过INI文件保存应用程

序的一些运行环境信息,然后在程序中读取INI文件中的设置信息并据以处理。一旦程序

的运行环境需要变更,则可以通过直接修改INI文件或在程序中提供专门的界面间接地修

改INI文件来保证程序的可用性。

  VB(Visual Basic)语言是近年来十分流行的一种面向对象的编程语言,但VB本身并

不提供操纵INI文件的函数。所幸的是, VB支持DLL(Dynamic Link Library)的调用。(

一个DLL事实上就是一个可供其它支持DLL调用的应用程序调用的外部函数集。)DLL中的

函数称为API(应用编程接口,Application Programming Interface)函数。我们可以通

过调用相应的API函数来实现操纵INI文件的功能。下面列出了相关的API函数及其说明。

在使用这些函数之前,必须首先在VB的模块文件(.bas)中用Declare语句对它们进行声明

三、实例分析

  下面就笔者参加天津财经学院教学办公自动化(OA)系统开发的实践介绍一下具体的

实现方法。假定项目文件为man.mak,对应的INI文件为man.ini,其部分内容如下:

[数据库]
文件名=\\DEC_LX5120\DB\OA.mdb
[开户银行]
类型数=3
B1=中国人民银行
B2=中国农业银行
B3=中国工商银行

1. 在程序启动时(执行SUB MAIN()和SUB FORM_LOAD()),从man.ini文件中读取相应的

值并进行以后的操作。其中SUB MAIN()中的有关代码如下:

Dim DbName as String*255   '数据库名
Dim n as Integer
'得到INI文件名,INIfileName为一全局变量
INIfileName=App.Path&"\"&app.ExeName&".ini"
'从man.ini中读取数据库文件名
n=GetPrivateProfileString("数据库","文件名","",DbName,Len(DbName),INIfileN

ame)
DbName=Left(DbName,n)
'打开数据库,Db为一全局变量
Set    Db=OpenDatabase(DbName)
在FORM_LOAD()过程中,读取了man.ini中有关的内容并加入相应的组合框(Combo Box)列

表中。这里只给出对"[开户银行]"段的相应操作,代码如下:
Dim BankCount as Integer   '银行类型数
Dim BankName as String*255   '银行名
Dim i as Integer,n as Integer
'读取原有银行类型数
BankCount=GetPrivateProfileInt("开户银行","类型数",0,INIfileName)
'读取银行名并加入到组合框cmbBank中
For I=1 to BankCount
n=GetPrivateProfileString("开户银行","B"&i,BankName,Len(BankName),INIfileN

ame)
BankName=Left(BankName,n)
cmbBank.AddItem BankName
Next I

2. 在程序中提供了一个专用维护界面,该界面通过操作INI文件的相应内容来实现相应的

修改。

'下面代码实现数据库路径的修改
Dim n as Integer
'txtDbName.Text对应新的数据库文件名
If     txtDbName.Text=""    Then
    MsgBox "数据库文件名不能为空!",MB_ICONSTOP,App.Title
    txtDbName.SetFocus
    Exit Sub
Else
   '修改数据库文件名
   

n=WritePrivateProfileString("数据库","文件名",txtDbName.Text,INIfileName)
End If

'下面代码往组合框"开户银行"中增加一个新银行
Dim NewBank as String       '新银行名
Dim BankCount as Integer   '银行类型数
Dim I as Integer,n as Integer
'输入新银行名
NewBank=InputBox("增加开户银行。",App.Title,"")
If    NewBank=""    Then
        MsgBox "银行名不能为空!",MB_ICONSTOP,App.Title
        Exit Sub
Else
   '判断输入的银行名是否已存在于列表中
    For     I=0    to     cmbBank.ListCount-1
        If    NewBank=cmbBank.List(i)     Then
           '存在则终止
            MsgBox NewBank&"已存在于列表中!",MB_ICONSTOP,App.Title)
            Exit Sub
        End If
    Next I
   '读取原银行类型数
    BankCount=GetPriVateProfileInt("开户银行","类型数",0,INIfileName)
   '将银行类型数增1
    BankCount=BankCount+1   
n=WritePrivateProfileString("开户银行","类型数",Str(BankCount),INIfileName

)
   '将新银行名写入INI文件中
   

n=WritePrivateProfileString("开户银行","B"&BankCount,NewBank,INIfileName)
End If

四、结论

  综上所述,在实际的VB应用程序开发中,适当地利用INI文件,可以很好地改善程序的

可维护性和可用性。尤其在数据库访问中使用INI文件可使用户在数据库路径改变时免去

修改原代码之苦。在实际开发中,若结合一定的维护界面,也可使应用程序容易维护,增强

友好性。

参考书目:
1. Visual Basic For Windows程序Windows API参考手册    曾志民 张秀茂 等编   

   科学出版社
2. Visual Basic 3.0 For Windows语言 参考手册   MicreSoft  Corporation著   

 学苑出版社  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
VB6中一个非常好用的读写Ini文件的模块
在VB应用程序中使用INI文件的一点体会
用VB开发应用程序如何使用INI文件
VB中利用Windows API实现文件操作,VB教程,VB案例,VB实例
VB解压缩带密码RAR文件的两者方法
VB API:文件处理函数 第三页
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服