pfc_delprofilestring.srf 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. $PBExportHeader$pfc_delprofilestring.srf
  2. global type pfc_delprofilestring from function_object
  3. end type
  4. forward prototypes
  5. global function integer pfc_delprofilestring (string as_file, string as_section, string as_key)
  6. end prototypes
  7. global function integer pfc_delprofilestring (string as_file, string as_section, string as_key);// Arguments:
  8. // as_file The .ini file.
  9. // as_section The section name that the entry to be deleted is in.
  10. // as_key The key name of the entry that should be deleted from
  11. // the specified section.
  12. // (此参数为空值时删除整个节).
  13. // Returns: Integer
  14. // 1 success
  15. // 0 section does not exist, or key name does not exist
  16. // within specified section.
  17. // -1 file error
  18. // -2 if .INI file does not exist or has not been specified.
  19. //变量声明
  20. Boolean lb_skipline
  21. Boolean lb_sectionfound
  22. Boolean lb_entryremoved
  23. Integer li_file
  24. Integer li_rc = 1
  25. Integer li_keylength
  26. Long ll_length
  27. Long ll_first
  28. Long ll_last
  29. Long ll_pos
  30. String ls_line
  31. String ls_section
  32. String ls_temp
  33. String ls_newfile
  34. // 判断指定的INI文件是否存在
  35. IF NOT FileExists (as_file) THEN
  36. RETURN -2
  37. END IF
  38. // 打开指定的INI文件
  39. ll_length = FileLength (as_file)
  40. li_file = FileOpen (as_file)
  41. IF li_file = -1 THEN RETURN li_file
  42. //////////////////////////////////////////////////////////////////////////// //
  43. // 逐行读取INI文件并删除指定的节或者指定节中指定的项目
  44. // 原理:判断节和条目是否需要删除,如果需要删除,则跳过此行,
  45. // 否则,将此行保存到新文件字串变量中。然后再写入新的
  46. // 字串替换原来INI文件中的数据。
  47. //////////////////////////////////////////////////////////////////////////////
  48. li_keylength = Len (as_key)
  49. DO WHILE li_rc >= 0
  50. // 读取一行数据
  51. li_rc = FileRead (li_file, ls_line)
  52. IF li_rc = -1 THEN
  53. RETURN -1
  54. END IF
  55. IF as_key = "" THEN
  56. // 未指定删除条目,删除整个节
  57. IF li_rc >= 1 THEN
  58. //判断当前行是否为节
  59. ll_first = Pos (ls_line, "[")
  60. ll_last = Pos (ls_line, "]")
  61. IF ll_first > 0 AND ll_last > 0 THEN
  62. // 当前行为节,取节名
  63. ls_temp = Trim (ls_line)
  64. IF Left (ls_temp, 1) = "[" THEN
  65. ll_pos = Pos (ls_temp, "]")
  66. ls_section = Mid (ls_temp, 2, ll_pos - 2)
  67. //判断当前节是否为需要删除的节
  68. IF Lower (ls_section) = Lower (as_section) THEN
  69. // 此节全部删除,从当前行开始
  70. lb_sectionfound = TRUE
  71. lb_skipline = TRUE
  72. ELSE
  73. // 当前行为节但不是指定的节名,指定的节已经删除
  74. lb_skipline = FALSE
  75. END IF
  76. END IF
  77. END IF
  78. END IF
  79. // 添加行结束符
  80. ls_line = ls_line + "~013~010"
  81. // 创建新文件
  82. IF li_rc >= 0 AND NOT lb_skipline THEN
  83. ls_newfile = ls_newfile + ls_line
  84. END IF
  85. ELSE
  86. IF NOT lb_entryremoved THEN //指定的条目尚未删除
  87. IF li_rc > 0 THEN //非回车或者换行符(即非空行)
  88. // 查找指定的节
  89. ll_first = Pos (ls_line, "[")
  90. ll_last = Pos (ls_line, "]")
  91. // 判断行是否为节
  92. IF ll_first > 0 AND ll_last > 0 THEN
  93. // 此行为节,取节名
  94. ls_temp = Trim(ls_line)
  95. IF Left (ls_temp, 1) = "[" THEN
  96. ll_pos = Pos (ls_temp, "]")
  97. ls_section = Mid (ls_temp, 2, ll_pos - 2)
  98. // 判断此节是否为要删除的节
  99. IF Lower (ls_section) = Lower (as_section) THEN
  100. // 为需要删除的节
  101. lb_sectionfound = TRUE
  102. ELSE
  103. // 不是需要删除的节
  104. lb_sectionfound = FALSE
  105. END IF
  106. END IF
  107. ELSE
  108. // 当前行不为节
  109. IF lb_sectionfound THEN
  110. // 已经查找到指定节,查找指定的条目
  111. ls_temp = Trim (ls_line)
  112. // 判断是否为需要删除的条目
  113. IF Lower (Left (ls_temp, li_keylength)) = Lower (as_key) THEN
  114. // 此条目为需要删除的条目
  115. ls_temp = Trim (Mid (ls_temp, li_keylength + 1))
  116. IF Char (ls_temp) = "=" THEN // 条目后第一个字符必定为“=”号
  117. // 删除条目
  118. lb_entryremoved = TRUE
  119. //条目已经删除
  120. lb_skipline = TRUE
  121. END IF
  122. END IF
  123. END IF
  124. END IF
  125. END IF
  126. ELSE
  127. // 指定的条目已经删除,Skip
  128. lb_skipline = FALSE
  129. END IF
  130. // 添加行结束符
  131. ls_line = ls_line + "~013~010"
  132. IF li_rc >= 0 AND NOT lb_skipline THEN
  133. //创建新文件(准备数据)
  134. ls_newfile = ls_newfile+ ls_line
  135. END IF
  136. END IF
  137. LOOP
  138. // Close the input file
  139. FileClose (li_file)
  140. // 没有找到指定的节或者指定的条目返回0
  141. If (NOT lb_sectionfound) THEN
  142. RETURN 0
  143. END IF
  144. If (NOT lb_entryremoved) And (as_key <> "") THEN
  145. RETURN 0
  146. END IF
  147. //使用新的数据替换INI文件
  148. Integer li_FileNo, li_writes, li_cnt
  149. Long ll_StrLen, ll_currentpos
  150. String ls_Text
  151. li_FileNo = FileOpen(as_file, StreamMode!, Write!, LockReadWrite!, Replace!)
  152. IF li_FileNo < 0 THEN RETURN -1
  153. ll_StrLen = Len(ls_newfile)
  154. // 一次最多只能写入32765个字符
  155. IF ll_StrLen > 32765 THEN
  156. IF Mod(ll_StrLen, 32765) = 0 THEN
  157. li_writes = ll_StrLen / 32765
  158. ELSE
  159. li_writes = (ll_StrLen / 32765) + 1
  160. END IF
  161. ELSE
  162. li_writes = 1
  163. END IF
  164. ll_currentpos = 1
  165. FOR li_cnt = 1 TO li_writes
  166. ls_Text = Mid(ls_newfile, ll_currentpos, 32765)
  167. ll_currentpos += 32765
  168. IF FileWrite(li_FileNo, ls_Text) = -1 THEN
  169. RETURN -1
  170. END IF
  171. NEXT
  172. FileClose(li_FileNo)
  173. RETURN 1
  174. end function