数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
PB中对INI文件读写的补充函数:删除指定的节或者指定节中某个项

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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




相关文章

相关软件