在日常工作中,经常用到对某个目录下文件中字符串替换的功能。如果对一个目录进行替换,实现上是很简单,但是对于子目录也要进行替换,那就麻烦一些了。以下是两个实现的方式。
1、采用com控件
function toReplaceDirString
lparameters tcFromDir, tcFind, tcReplace, lcExt
*? tcFromDir
if parameters() < 3
wait window 'Parameters Error!'
return
endif
set safety off
activate screen
if !directory(tcFromDir)
wait window tcFromDir + ' not existed!'
return .f.
endif
Local lcFromDir
lcFromDir = addbs(tcFromDir)
if vartype(lcExt)#'C'
lcExt = '*.*'
endif
clea
if !((upper('_utility'))$(set('CLASS')))
set CLASSLIB TO ('_utility') ADDI
endif
local loFile
loFile = createobject('_filer')
loFile.cFileExpression = lcExt
loFile.cSearchPath = lcFromDir
loFile.find()
*? vartype(loFile.oFiles)
if isNull(loFile.oFiles)
wait window 'file is null'
return .t.
endif
Local lni, laTemp
for lni = 1 to loFile.oFiles.count
if int(loFile.oFiles.item(lni).LastWriteTime) = date() - date(1899,12,30)
if loFile.oFiles.item(lni).Attr = 32
*!*拷贝文件
lcFromFile = loFile.oFiles.item(lni).Path + loFile.oFiles.item(lni).name
if file(lcFromFile)
lcText = filetostr(lcFromFile)
lcText = strtran(lcText, tcFind, tcReplace)
=strtofile(lcText, lcFromFile)
wait window 'ok replace file ' + lcFromFile nowait
endif
endif
endif
endfor
return .t.
endfunc
这种实现利用了微软的com控件,实现简单。
2、自己编程实现
****************************************
*功能说明:
*替换目录以及子目录下的文件的字符串。
*
*参数说明:
*lcDir 替换的根目录
*lcFind 查找字符串
*lcReplace 替换字符串
*lcExt 扩展名
*
*日期:2001.10.08
*作者:天涯闲人
*
*修改记录:
****************************************
function to_replacedirstring
lparameters lcDir, lcFind, lcReplace, lcExt
if parameters() # 4
wait window 'Parameters Error!'
return
endif
set safety off
if !directory(lcDir)
wait window lcDir + ' not existed!'
return .f.
endif
local lnFile, lni, lnDir, lnj
local array laDirs(1,1)
local array laFiles(1,1)
Local lcFromFile, lcText, lcEndDir
lnFile = adir(laFiles, addbs(lcDir) + lcExt)
lcEndDir = addbs(lcDir)
for lnj = 1 to lnFile
*!*在这里进行替换操作,当然,其中要求不能够是目录文件
*if !('D'$laFiles[lnj, 5])&&是文件
if (laFiles[lnj, 3] = date())&&只更新当天生成的文件
lcFromFile = lcEndDir + laFiles[lnj, 1]
if file(lcFromFile)
lcText = filetostr(lcFromFile)
lcText = strtran(lcText, lcFind, lcReplace)
=strtofile(lcText, lcFromFile)
wait window 'ok replace dir ' + lcFromFile nowait
endif
endif
*endif
endfor
lnDir = adir(laDirs, addbs(lcDir) + '*.*', 'D')
for lni = 1 to lnDir
if ('D'$laDirs[lni, 5] and !('.'$laDirs[lni, 1]))
=to_replacedirstring(addbs(lcDir) + laDirs[lni, 1], lcFind, lcReplace, lcExt)
endif
endfor
endfunc
以上两种实现方式中,对于效率而言,经测试,第二种明显快于第一种方式。