小弟需要在程序里实现修改Ini文件里面的内容....
点击按钮实现修改:
例如:333.ini文件在  " d:\ini\  " 下 (文件所在路径:  d:\ini\333.ini)  
333.ini文件内容假设是:
XXXXXXXXXXXXXXXXXX = YYY.12222
当我点击command1按钮时,程序会根据Text1.text里输入的数值修改333.ini的内容.并保存他.
假设text1.text的内容为TTT.77 那么点击按钮后程序会修改XXXXXXXXXXXXXXXXXX = YYY.12222 为XXXXXXXXXXXXXXXXXX = TTT.77222 (只会替换相应的位数)
就是这个意思了
小弟最后60分了.都给了吧.希望老兄能够写出我容易看懂的格式.
就像这样(也就是准源码了.谢谢了):
Private Sub Command1_Click()    Label1.Caption = "你好啊"
    form1.Caption = "欢迎"End Sub
小弟实在是没有分了,觉得分数不是很适合的朋友,给我发短信,我会在有分的时候给你补过.....小弟谢谢了.

解决方案 »

  1.   

    哦~~小弟忘了说了,ini文件里有N行
    如何指定第几行呢???因为行数已经超过了1000行
    所以能实现编辑固定行数比较好一点.....谢谢!!!
    分数不够的话,另补50分,因为小弟不知道这样的分数是否合适
    小弟只是用来做研究,我的一个小程序需要用到这个方法
    谢谢大家了.........
      

  2.   

    以下这些代码放到一个公用模块里面,之后你就可以在任何地方调用了。Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
    Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
    Public Function GetINI(strINIFileName As String, strSection As String, _
                strKey As String, strDefault As String)
    On Error GoTo ErrMsg
        Dim strTemp As String
        Dim intLength As Integer
        
        '判断INI文件是否存在
        If Dir$(strINIFileName) = "" Then
            MsgBox "INI文件“" & gstrCurrPath & gstrINIFile & "”已被损坏,程序将自动恢复该文件到缺省值!", vbExclamation, "警告!"
            RepairINIFile
        End If
        strTemp = Space$(256)
        intLength = GetPrivateProfileString(strSection, strKey, strDefault, strTemp, 255, strINIFileName)
        GetINI = Left$(strTemp, intLength)
        Exit Function
    ErrMsg:
        MsgBox "从INI文件“" & gstrCurrPath & gstrINIFile & "”文件读取数据时出现异常,请检查是否删除或移动了该文件!" & vbCrLf & _
                Err.Description, vbExclamation, "提示"
    End FunctionPublic Sub WriteINI(strINIFileName As String, strSection As String, _
                strKey As String, strValue As String)
    On Error GoTo ErrMsg
        Dim n As Integer    'Replace any CR/LF characters with spaces
        If Len(strValue) >= 1 Then
            For n = Len(strValue) To 1
                If Mid$(strValue, n, 1) = vbCr Or Mid(strValue, n, 1) = vbLf Then
                    Mid$(strValue, n, 1) = ""
                End If
            Next n
        End If
        
        n = WritePrivateProfileString(strSection, strKey, strValue, strINIFileName)
        Exit Sub
    ErrMsg:
        MsgBox "向INI文件“" & gstrCurrPath & gstrINIFile & "”文件写入数据时出现异常,请检查是否删除或移动了该文件!" & vbCrLf & _
                Err.Description, vbExclamation, "提示"
    End Sub
      

  3.   

    INI文件的格式:
    [Database]
    DSN=Irrigation
    PWD=
    UID=[StartPage]
    PageName=StartPage.jpg[IrrigationMap]
    MapName=IrrigationMap.bmp
    “[]”里面的是段名,“=”左边的是关键字,右边是存储的数据。
    假设上面的文件名是“c:\test.ini”,现在我要把StartPage段下的MapName值改为test.bmp。就是说只改变前半部分,后缀不该:
    dim strTemp as string
    strTemp=getini("c:\test.ini","StartPage","PageName","?")'从INI文件读出信息
    strTemp=right(strTemp,4)'取右边四个字符:.bmp
    strTemp="test" & strTemp'现在strTemp成了test.bmp
    writeini "c:\test.ini","StartPage","PageName",strTemp'写入INI文件
      

  4.   

    从上面可以看到事实上INI文件的行数并不需要关心,你只需知道它在哪个段,属于哪个关键字,就可以了。
      

  5.   

    Option ExplicitPrivate Sub Command1_Click()
        Dim ls_INI() As String, s As String
        Dim i As Long
        
        '打开文件
        Open "C:\aa.ini" For Input As #1
        s = StrConv(InputB(LOF(1), #1), vbUnicode)
        Close #1
        
        ls_INI = Split(s, vbCrLf) '把文件容拆开存到数组里,一个数组元素是一行.这样想修改哪行都行,改完再存到文件里就行了~
        
        '假如将第3行改为"bbbb"
        ls_INI(2) = "bbbb" '数组从0开始
        
        '保存到文件
        Open "C:\bb.ini" For Input As #1
        For i = 0 To UBound(ls_INI) - 1
            Print #1, ls_INI(i)
        Next
        Close #1
    End Sub
        
      

  6.   

    谢谢两位..但是有个很郁闷的问题啊.
    程序怎么会根据Text1.text里输入的数值来修改ini的内容???
    还有就是,他只是修改ini内容,只是把第几行字符串给改写了,就好了,修改的时候完全是不可见的(也就是不出显那个文件框.)........ini文件内容不定,没有固定格式.且繁多...顺便提一提就是,我想在第5---10行前面加 ";(分号) " 
    小弟就是卡在这里的,还请高手们再多多帮忙啊..
    谢谢了...我很菜.什么都不会.但又很想学...55555....谢谢了!
      

  7.   

    Option ExplicitPrivate Sub Command1_Click()
        Dim ls_INI() As String, s As String
        Dim i As Long
        
        '打开文件
        Open "C:\aa.ini" For Input As #1
        s = StrConv(InputB(LOF(1), #1), vbUnicode)
        Close #1
        
        ls_INI = Split(s, vbCrLf) '把文件容拆开存到数组里,一个数组元素是一行.这样想修改哪行都行,改完再存到文件里就行了~
        
        '假如将第3行改为"bbbb"
        ls_INI(2) = "bbbb" '数组从0开始
        ls_INI(4) = ";" & ls_INI(4) '在第5行前加分号
        ls_INI(5) = ";" & ls_INI(5) 
              ……
              ……
        ls_INI(9) = ";" & ls_INI(9) '在第行前加分号
        
        '保存到文件
        Open "C:\bb.ini" For Input As #1
        For i = 0 To UBound(ls_INI) - 1
            Print #1, ls_INI(i)
        Next
        Close #1
    End Sub
      

  8.   

    程序怎么会根据Text1.text里输入的数值来修改ini的内容???用字符串控制函数,也就那么几个INSTR返回 Variant (Long),指定一字符串在另一字符串中最先出现的位置。语法 InStr([start, ]string1, string2[, compare])InStr 函数的语法具有下面的参数:部分 说明
    start 可选参数。为数值表达式,设置每次搜索的起点。如果省略,将从第一个字符的位置开始。如果 start 包含 Null,将发生错误。如果指定了 compare 参数,则一定要有 start 参数。
    string1 必要参数。接受搜索的字符串表达式。
    string2 必要参数。被搜索的字符串表达式。
    Compare 可选参数。指定字符串比较。此 compare 参数是可以省略的,也可以是 0, 1或 2。指定 0(缺省)做二进制比较。指定 1 做不区分大小写的文本比较。仅对 Microsoft Access,指定 2 来做基于数据库中包含的信息的比较。如果 compare 是 Null,将发生错误。如果省略 compare,Option Compare 的设置将决定比较的类型。
    返回值如果 InStr返回
    string1 为零长度 0
    string1 为 Null Null
    string2 为零长度 start
    string2 为 Null Null
    string2 找不到 0
    在 string1 中找到string2  找到的位置
    start > string2 0
    说明InStrB 函数作用于包含在字符串中的字节数据。所以 InStrB 返回的是字节位置,而不是字符位置。
    ==================================================================MID
    返回 Variant (String),其中包含字符串中指定数量的字符。语法Mid(string, start[, length])Mid 函数的语法具有下面的命名参数:部分 说明
    string 必要参数。字符串表达式,从中返回字符。如果 string 包含 Null,将返回 Null。
    start 必要参数。为 Long。string 中被取出部分的字符位置。如果 start 超过 string 的字符数,Mid 返回零长度字符串 ("")。
    length 可选参数;为 Variant (Long)。要返回的字符数。如果省略或 length 超过文本的字符数(包括 start 处的字符),将返回字符串中从 start 到尾端的所有字符。
    说明欲知 string 的字符数,可用 Len 函数。注意   MidB 函数作用于字符串中包含的字节数据。因此其参数指定的是字节数,而不是字符数。
    ======================================================================Replace 函数
      

  9.   

    要不的话,这样你看如何.
    在当前探讨的这个程序的根目录下有A B C 三个未知属性文件.点击command1(对应文件A)按钮后,程序执行:
    1.监测INI文件里第一行有没有;000A要是有的话当你点击commnad1(对应A)时,会提示"已经修改过了"如果第一行没有;000A 该字符串的话.进行下一步.
    2.程序会在D:\ini 文件夹里新建一个文件夹,且命名为BAK,把原始的文件复制一份到BAK(如果该文件夹有BAK文件夹了,就直接备份在这个文件夹里),这个时候A再来改名覆盖它.如果没有的话就直接放进去.
    3.程序会复制A 到 D:\ini  文件夹里面,且自动改名为Aspen.ini.
    同理可得 B , C 按钮的设置了.
    B 最后替换文件名为: BaseConfig.ini
    C 最后替换文件名为: CMIDIA.ini
    由于小弟初学...看代码不是很懂,所以只能请教这种方法了.....
      

  10.   

    读取文件内容的语句看我前面的贴子~~
    1.
    If InStr(ls_INI(0), ";000A") <> 0 Then
        MsgBox "找到了!"
    Else
        MsgBox "没找到!"
    End If2.
    if dir(App.path & "\bak") = "" then mkdir("BAK") '如果不存在则创建文件夹
    FileCopy App.Path & "\a.ini", App.Path & "\bak\a.ini" '复制文件,路径你自己指定吧3.没看懂~~
      

  11.   

    就是说,我打算这样...
    编辑好几个INI文件.然后把他们分别改名为"A B C".dat文件
    设定3个按钮(按钮1为A,按钮2为B,按钮3为C),然后,当点击按钮1的时候,该程序会把他目录下的A.DAT复制到D:\ini 下,并且改名为Aspen.ini 
    接下来就是我说的了:
    第1步:监测INI文件里第一行有没有;000A要是有的话当你点击commnad1(对应A)时,会提示"已经修改过了"如果第一行没有;000A 该字符串的话.进行下一步.
    第2步:程序会在D:\ini 文件夹里新建一个文件夹,且命名为BAK,把原始的文件复制一份到BAK(如果该文件夹有BAK文件夹了,就直接备份在这个文件夹里),这个时候A再来改名覆盖它.如果没有的话就直接放进去.就是这个意思~~~要是还不明白的话,我会继续说明的~~~
      

  12.   

    '把下面的复制到模块中就可以了
    Option Explicit'-------------------------------------------------------------------------------
    'APIs for reading and writing retrieving information from an ini file:
    Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
    Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long'-------------------------------------------------------------------------------
    'Function for reading a key from an ini file:
    Public Function ReadINI(iSection As String, iKey As String, iniFile As String)
    Dim RetStr As String, Retlen As String, iPath As String
    iPath = App.Path & "\" & iniFile
    RetStr = Space$(255)
    Retlen = GetPrivateProfileString(iSection, iKey, "", RetStr, Len(RetStr), iPath)
    RetStr = Left$(RetStr, Retlen)
    ReadINI = IIf(RetStr = "", "Empty...", RetStr)
    End Function'-------------------------------------------------------------------------------
    'Function for writing a key to an ini file:
    Public Sub WriteINI(iSection As String, iKey As String, iniFile As String, Text As String)
    WritePrivateProfileString iSection, iKey, Text, iniFile
    End Sub'调用范例
    Filtering = ReadINI("Main", "Filter", "Config.ini")
      

  13.   

    Private Declare Function GetPrivateProfileString Lib "kernel32"  _
       Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _
       ByVal lpKeyName As Any, ByVal lpDefault As String,  _
       ByVal lpReturnedString As String, ByVal nSize As Long, _
       ByVal lpFileName As String) As Long
    Private Declare Function WritePrivateProfileString Lib "kernel32"  _
       Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, _
       ByVal lpKeyName As Any, ByVal lpString As Any, _
       ByVal lpFileName As String) As LongPrivate Sub Command1_Click()
    Dim success As Long
    success = WritePrivateProfileString("MyApp", "text1", Text1.Text, "c:\aa.ini")
    注释:叁数一 Section Name
    注释:叁数二 於.ini中的项目
    注释:叁数三 项目的内容
    注释:叁数四 .ini文件的名称
    success = WritePrivateProfileString("MyApp", "text2", Text2.Text, "c:\aa.ini")
    success = WritePrivateProfileString("MyApp2", "text3", Text3.Text, "c:\aa.ini")
    End SubPrivate Sub Form_load()
    Dim ret As Long
    Dim buff As String
    buff = String(255, 0)
    ret = GetPrivateProfileString("Myapp", "text1", "text1", buff, 256, "c:\aa.ini")
    注释:若.ini MyApp中无text1,则采用叁数三的值
    Text1.Text = buff
    buff = String(255, 0)
    ret = GetPrivateProfileString("Myapp", "text2", "text2", buff, 256, "c:\aa.ini")
    Text2.Text = buff
    buff = String(255, 0)
    ret = GetPrivateProfileString("Myapp2", "text3", "text3", buff, 256, "c:\aa.ini")
    Text3.Text = buff
    End Sub
      
      

  14.   

    看的不是很懂啊.....小弟很菜的.....程序思路概述:
    也许这样说可能会更加清楚点吧:
    咱们假设以下这段这是INI内容(INI文件路径为:"D:\ini\333.ini"):
    ============================================
    [Config]
    LangID=0
    IsSelective=0
    InstallType=0
    [Variables]
    KRU=Mi56
    KEW=Yes
    VarName1=%ISWIN31%
    VarValue1=False
    VarName2=%ISWIN32S%
    VarValue2=False
    VarName3=%ISWIN95%
    VarValue3=False
    VarName4=%ISWIN98%
    VarValue4=False
    VarName5=%ISWINNT3%
    VarValue5=False
    VarName6=%ISWINNT4%
    VarValue6=False
    VarName7=%ISWIN2000%
    VarValue7=True
    VarName8=8.5%
    VarValue8=6
    VarName9=%ISUSERNTADMIN%
    VarValue9=True
    VarName10=%WINDIR%
    .                    ( . 代表很多行)
    .
    .
    I-90
    .
    .
    K-300
    VarValue10=Yes
    VarName11=%SYSDIR%
    ============================================
    注:(以上是ini文件内容,只是个例子.....)
    我的这个程序中有以下控件:
    textbox(用来输入数值)有:text1, text2, text3, (打算用来输入数值修改ini内的相关数值以及路径选择)
    commandButton 有:command1, command2, command3, command4(用来点击,确定并执行修改内容)
    list 有 list1 (用来选择内容)
    另外就是还有一个文件,名字是A属性是dll( A.dll ,目的是为了不想别人知道这是个ini文件 )
    程序执行的时候首先监测当前目录下有没有A.dll文件,没有的话提示找不到A.dll文件,该程序退出.有的话进行下一步,继续监测D:\ini\下有没有333.ini这个文件,没有的话此程序自动将准备好的A.dll文件改成333.ini文件放在D:\ini\(最好是放在text3.text所填写的路径内.)如果目录下有333.ini的话直接跳过该选项进行下一步.
    以上这些都是在程序运行的时候执行的.
    接下来开始操作程序了,在text1.text里输入一个数值,假设我输入: 90 (能限制最大填入值最好了.0-100)
    那么当点击command1的时候,这个程序会把文件里的 "VarValue8=6" 修改为 VarValue8=90 也就是只修改"="号后面的内容.(请参看我上述ini例子内容)
    选择list的内容(只有Yes和No)当选择yes并点击command2按钮的时候ini文件内的
    KRU=Mi56
    KEW=Yes 
    改变为:
    KRU=USER
    KEW=No 
    否则,前面加上";"号
    例如:
    ;KRU=Mi56
    ;KEW=Yes
    如果不用list而改用其他选择性控件的话(例如就像选择驱动器的控件一样代替List控件),请说明.(我的确是大白菜,VB的初级探索者....)
    接着说...在text2里输入15.5当点击command3的时候,程序会把ini文件内的
    VarValue7=True
    VarName8=8.5%
    修改为:
    VarValue7=False
    VarName8=15.5%
    也就是不改变15.5后面的百分号和"="前面的文字.(不好做到的话就直接替换整句.)
    另外小弟考虑的一点是,我需要修改的ini文件里有几千行字符串.要是直接定义字符串所在行数的话,我会有点怕怕的.不过在ini文件内加标记可以,例如我需要巴ini文件内第N行的 VarValue10=Yes 修改为 VarValue10=No 那么我可以在他的上一行中加上";0=0=0=0=0"
    就像这样:
    ;0=0=0=0=0
    VarValue10=Yes
    那么程序就直接在整个ini文件中查找";0=0=0=0=0"并且修改接下来的那一行. 
    还有就是.实现添加";"
    首先我会先在ini文件中添加标记,假设我会在I-90的上一行 和 K-300的下一行处添加标记"O-O和I-I",那么当我点击command4的时候,位于O-O和I-I之间每一行的最前端添加";"其他的就没有了. 小弟刚刚开始自学VB.很是艰难...看懂的甚少.有标准的源代码的话,小弟会从源码中明白函数的细节含义和语法的一些技巧.买了很多的书,还不如看些源码理解的深刻些....
    一个程序员朋友总是取笑我,说我没前途.我知道我很菜...但是我要让他知道:我虽然什么都不懂,但是我可以学....在CSDN上认识了许多的好朋友,都在默默的帮我,我很感激!打心眼里感激他们.我的分数不多.一直用着很省,很多时候都在赞分....因为我能帮别人的机会很少.
    说真的,我自己觉得我自己这次的问题就已经很苛刻很麻烦了...但我终究不懂...我的分数只有这么多了...还有最后20分...是应急用的...不管问题解不解决,朋友们能认真的看到这一步,小弟已经很感激了,我从(凌晨1:20)写到现在(凌晨3:26)<打字速度很慢...>只为朋友们明白我的思路,帮我因地制宜的解决问题.分数等我不久以后有了绝对会开新贴另补的.
    感谢大家关注我的问题,小弟真的很感激.....谢谢了.
    若是上述哪点说的不是很清楚详细的话.小弟重新做解...
    恳请热心的朋友多多帮忙.....谢谢!