PB中对INI文件读写的补充函数:删除指定的节或者指定节中某个项

类别:数据库 点击:0 评论:0 推荐:

我们在使用PB的INI函数读写INI文件时,有时也可能需要动态地删除某个节或者某个项,此函数即完成此功能。此函数是从PFC里分离出来的,希望对大家有用。

$PBExportHeader$pfc_delprofilestring.srf
$PBExportComments$Delete SECTION or KEY in INI file
global type pfc_delprofilestring from function_object
end type

forward prototypes
global function integer pfc_delprofilestring (string as_file, string as_section, string as_key)
end prototypes

global function integer pfc_delprofilestring (string as_file, string as_section, string as_key);// Function:    of_Delete
// Arguments:  
// as_file   The .ini file.
// as_section  The section name that the entry to be deleted is in.
// as_key   The key name of the entry that should be deleted from
//       the specified section.
//       (此参数为空值时删除整个节).
// Returns:   Integer
//       1 success
//       0 section does not exist, or key name does not exist
//       within specified section.
//      -1 file error
//      -2 if .INI file does not exist or has not been specified.

//变量声明
boolean  lb_skipline
boolean  lb_sectionfound
boolean  lb_entryremoved
integer  li_file
integer  li_rc = 1
integer  li_keylength
long   ll_length
long   ll_first
long   ll_last
long   ll_pos
string  ls_line
string  ls_section
string  ls_temp
string      ls_newfile

// 判断指定的INI文件是否存在
if not FileExists (as_file) then
 return -2
end if

// 打开指定的INI文件
ll_length = FileLength (as_file)
li_file = FileOpen (as_file)
if li_file = -1 then return li_file

//////////////////////////////////////////////////////////////////////////////
// 逐行读取INI文件并删除指定的节或者指定节中指定的项目
// 原理:判断节和条目是否需要删除,如果需要删除,则跳过此行,
//       否则,将此行保存到新文件字串变量中。然后再写入新的
//       字串替换原来INI文件中的数据。
//////////////////////////////////////////////////////////////////////////////
li_keylength = Len (as_key)
do while li_rc >= 0
 // 读取一行数据
 li_rc = FileRead (li_file, ls_line)
 if li_rc = -1 then
  return -1
 end if
 
 if as_key="" then
  // 未指定删除条目,删除整个节
  if li_rc >= 1 then
   //判断当前行是否为节
   ll_first = Pos (ls_line, "[")
   ll_last = Pos (ls_line, "]")
   
   if ll_first >0 and ll_last >0 then
    // 当前行为节,取节名
    ls_temp = Trim (ls_line)
    if Left (ls_temp, 1) = "[" then
     ll_pos = Pos (ls_temp, "]")
     ls_section = Mid (ls_temp, 2, ll_pos - 2)
     //判断当前节是否为需要删除的节    
     if Lower (ls_section) = Lower (as_section) then
      // 此节全部删除,从当前行开始
      lb_sectionfound = true
      lb_skipline = true
     else
      // 当前行为节但不是指定的节名,指定的节已经删除
      lb_skipline = false
     end if
    end if
   end if
  end if
 
  // 添加行结束符
  ls_line = ls_line + "~013~010"
 
  // 创建新文件
  if li_rc >= 0 and not lb_skipline then
   ls_newfile=ls_newfile + ls_line
  end if
 else
  if not lb_entryremoved then //指定的条目尚未删除
   if li_rc > 0 then //非回车或者换行符(即非空行)
 
    // 查找指定的节
    ll_first = Pos (ls_line, "[")
    ll_last = Pos (ls_line, "]")
    
    // 判断行是否为节
    if ll_first > 0 and ll_last > 0 then
     // 此行为节,取节名
     ls_temp = trim(ls_line)
     if Left (ls_temp, 1) = "[" then
      ll_pos = Pos (ls_temp, "]")
      ls_section = Mid (ls_temp, 2, ll_pos - 2)
      // 判断此节是否为要删除的节       
      if Lower (ls_section) = Lower (as_section) then
       // 为需要删除的节
       lb_sectionfound = true
      else
       // 不是需要删除的节
       lb_sectionfound = false
      end if
     end if
    else
     // 当前行不为节
     if lb_sectionfound then
      // 已经查找到指定节,查找指定的条目
      ls_temp = Trim (ls_line)
      // 判断是否为需要删除的条目      
      if Lower (Left (ls_temp, li_keylength)) = Lower (as_key) then
       // 此条目为需要删除的条目     
       ls_temp = Trim (Mid (ls_temp, li_keylength + 1))
       if Char (ls_temp) = "=" then // 条目后第一个字符必定为“=”号
        // 删除条目
        lb_entryremoved = true
        //条目已经删除
        lb_skipline = true
       end if
      end if
     end if
    end if
   end if
  else
   // 指定的条目已经删除,Skip
   lb_skipline = false
  end if
 
  // 添加行结束符
  ls_line = ls_line + "~013~010"
 
  if li_rc >= 0 and not lb_skipline then
   //创建新文件(准备数据)
   ls_newfile=ls_newfile+ ls_line
  end if
 end if
loop

// Close the input file
FileClose (li_file)

// 没有找到指定的节或者指定的条目返回0
if (not lb_sectionfound) then
 return 0
end if

if (not lb_entryremoved) and (as_key<>"") then
 return 0
end if

//使用新的数据替换INI文件
integer  li_FileNo, li_writes, li_cnt
long   ll_StrLen, ll_currentpos
string  ls_Text

li_FileNo = FileOpen(as_file, StreamMode!, Write!, LockReadWrite!, Replace!)
If li_FileNo < 0 Then Return -1

ll_StrLen = Len(ls_newfile)

// 一次最多只能写入32765个字符
If ll_StrLen > 32765 Then
 If Mod(ll_StrLen, 32765) = 0 Then
  li_Writes = ll_StrLen / 32765
 Else
  li_Writes = (ll_StrLen / 32765) + 1
 End if
Else
 li_Writes = 1
End if

ll_CurrentPos = 1

For li_Cnt = 1 To li_Writes
 ls_Text = Mid(ls_newfile, ll_CurrentPos, 32765)
 ll_CurrentPos += 32765
 If FileWrite(li_FileNo, ls_Text) = -1 Then
  Return -1
 End if
Next

FileClose(li_FileNo)

Return 1
end function

本文地址:http://com.8s8s.com/it/it21400.htm