我们在使用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