文件搜索类
出处:网络
最近我碰到了VFP一个有趣的缺点。我需要一个能查找一个文件的应用程序,但在VFP里却找不到能完成这个任务的工具。我写了一个能够查找文件并返回其路径和文件名的类。它有一个可选的进程栏。我准备扩展它,使之能够支持通配符。
* 文件搜索类
* Ben Stack 7/2000
* bstack@uscost.com, bendito@freewwweb.com or blindpete@mail.com
* 不承诺
* 这个类就是如此。我没有任何警告和暗示。使用这个类,你必须自己承担风险。
* 基本用法
* cPathAndFilename = oFileSearch.Search(cFileName)
* ObjectName.Search(cFileName,[cBarText],[bShowWindow],[bMoreInfo],[bCmdButtons])
* cFileName 要查找的文件名和扩展名,支持通配符
* [cBarText] 放到进程栏的标题,默认为空,可选项
* [bShowWindow] 是否显示表单,逻辑型值,默认为.F.,可选项
* [bMoreInfo] 是否显示正在被搜索的路径,逻辑值,默认为.F.,可选项
* [bCmdButtons] 是否显示Cancel按钮,逻辑值,默认为.F.,可选项
* 返回:
* 如果找到: [Drive]:[Path][文件名 w/ 扩展名]
* w/ 扩展名 临时表(cursor): FILELIST (FOLDER C(254), FILENAME C(254)
* 如果没找到: empty()
* w/ 扩展名 临时表(cursor): FILELIST (FOLDER C(254), FILENAME C(254)
* 基本描述
* 这个类将从C盘到Z盘(如果存在的话)查找你传递给它的文件名。
* 它返回一个字符串 [Drive]:[Path][Filename w/ extension],如果没找到,还有
* empty()
* 如果使用了通配符(*/?),它返回一个临时表
* 请求
* 如果你对这个类做了重要的改进,请把它给我一份,Email到 bendito@freewwweb.com
* 或者 bstack@uscost.com
* 致谢
* 非常感谢 Chris Chamberlain
* 同时特别要感谢 Jon Scott, 他启迪了我怎样使用优美而危险的 DOEVENTS 命令。
* 举例:
* oFind.Search(cFileName,[cBarText],[bShowWindow],[bMoreInfo],[bCmdButtons])
oFind = createobject("FileSearch")
* 这个例子返回一个字符串
? oFind.Search("Config.sys","Config.sys - ",.T.,.T.,.T.)
* 这个例子建立一个临时表
? oFind.Search("*.sys","All System Files - ",.T.,.T.,.T.)
DEFINE CLASS "FileSearch" AS "FORM"
COUNTER = 0
Result = ""
BarCaption = ""
ButtonCancel =.F.
WildCard = .F.
ALWAYSONTOP = .T.
AUTOCENTER = .T.
SHOWWINDOW = 2 && 顶层表单
WINDOWTYPE = 1 && 模式
DRAWMODE = 9
TITLEBAR = 1
CONTROLBOX = .F.
HEIGHT = 83
WIDTH = 264+24
CAPTION = "File Search..."
ADD OBJECT "oTxtMore" AS "TEXTBOX" WITH ;
HEIGHT = 25, LEFT =12, WIDTH = 264, ALIGNMENT = 0, ;
TOP = 76, BACKSTYLE = 0, BORDERSTYLE = 0, FONTBOLD = .F.,;
TABSTOP = .F., ENABLED=.F., DISABLEDFORECOLOR = RGB(0,0,0),;
FONTSIZE = 8
ADD OBJECT "oTxt" AS "TEXTBOX" WITH ;
HEIGHT = 25, LEFT =12, WIDTH = 264, ALIGNMENT = 2, ;
TOP = 6, BACKCOLOR = RGB(255,255,255), ;
DISABLEDBACKCOLOR = RGB(255,255,255), ;
DISABLEDFORECOLOR = RGB(0,0,0), ;
ENABLED = .F., FONTBOLD = .T.
ADD OBJECT "oCmd1" AS "COMMANDBUTTON" WITH ;
CAPTION = "\br LEFT="96," HEIGHT="25,">WIDTH
= 97, TOP = 48
PROCEDURE oCmd1.CLICK
nQuit = MESSAGEBOX('确定要取消吗?',4+32,thisform.caption)
If nQuit = 6 THEN
thisform.ButtonCancel =.T. &&取消搜索
ENDIF
ENDPROC
ADD OBJECT "oShp" AS "SHAPE" WITH ;
BORDERSTYLE = 0, DRAWMODE = 14, FILLSTYLE = 0
PROCEDURE INIT
thisform.oshp.left=thisform.oTxt.left+1
thisform.oshp.top=thisform.oTxt.top +1
thisform.oshp.height=thisform.oTxt.height-2
thisform.oshp.visible = .T.
thisform.borderstyle = 2
ENDPROC
PROCEDURE Counter_assign
LPARAMETERS vNewVal
IF vNewVal <> thisform.counter THEN
thisform.counter = vNewVal
x = thisform.counter
thisform.oShp.width = x*thisform.oTxt.width/100
thisform.oTxt.value = thisform.BarCaption+ALLTRIM(STR(x))+"% Complete"
thisform.refresh
*Check if cancel button has been pushed Alt+C or clicked
IF MDOWN() OR CHRSAW() THEN
DOEVENTS
ENDIF
ENDIF
ENDPROC
PROCEDURE Search
PARAMETER cFileName, cBarText, bShow, bMore, bCmdButtons
*cFileName: 文件名 w/ 扩展名 没有通配符
*cBarText: 显示在进程栏中的标题
*bShow: .T. = 显示进程栏
*bMore: .T. = 显示关于进程栏的更多信息
*bCmdButtons 显示工具栏 (目前只有cancel...以后会更多的)
*Returns: FullPath [Drive]:[Path][Filename w/ extension]
*Validate Parameters 校验参数
IF TYPE("cFileName") <> "C" OR LEN(ALLTRIM(cFileName))
= 0
RETURN
ENDIF
IF TYPE("cBarText") <> "C" THEN
cBarText = ""
ENDIF
IF TYPE("bshow") <> "L" THEN
bShow = .F.
ENDIF
IF TYPE("bMore") <> "L" THEN
bMore = .F.
ENDIF
IF TYPE("bCmdButtons") <> "L" THEN
bCmdButtons = .T.
ENDIF
IF AT("?",cFileName)>0 OR AT("*",cFileName)>0
THEN
thisform.wildcard = .T.
ENDIF
*Init Display
IF bShow THEN
thisform.Counter = 0
thisform.Visible = .T.
thisform.otxtMore.Visible = bMore
thisform.oCmd1.Visible = bCmdButtons
thisform.oCmd1.Enabled = bCmdButtons
thisform.BarCaption = cBarText
IF bMore THEN
thisform.height = 77
thisform.otxtMore.top = thisform.height -31
ELSE
thisform.height = 46
ENDIF
IF bCmdButtons THEN
thisform.height = thisform.height + 31
thisform.ocmd1.top = thisform.height -31
thisform.ocmd1.setfocus
ENDIF
ENDIF
*Directory List
IF thisform.wildcard THEN
CREATE CURSOR FileList(FOLDER C(254), FileName C(254)) && For
Wild Cards
ENDIF
CREATE CURSOR DirList(FOLDER M)
*CREATE CURSOR DirList(FOLDER C(254))
SELECT DirList
cStartDir = SYS(5)+CURDIR()
nRecord = 1
FOR nDrive = 65 TO 90
cDrive = CHR(nDrive)
cDir = "\"
IF DRIVETYPE(cDrive)=3 OR DRIVETYPE(cDrive)=4 THEN &&Hard or
Net Drive
cPath = cDrive+":&cDir"
SET DEFAULT TO "&cPath"
APPEND BLANK
REPLACE folder WITH cPath
ADIR(aDirList,"","D") && copy all the current
dirs into an array
cPathNow = SYS(5)+CURDIR()
GO nRecord
bKeepGoing =.T.
DO WHILE bKeepGoing=.T.
nRecord = RECNO()
cPath = ALLTRIM(DirList.Folder)
thisform.otxtMore.value = cPath
thisform.Counter = 100*(nRecord/RECCOUNT())
*Check if Cancel Command is in effect
IF thisform.ButtonCancel =.T. THEN
bKeepGoing =.F.
cDrivePathFile = ""
nDrive = 91 && 跳出搜索驱动器(LOOP)
EXIT && 结束当前驱动器(DO LOOP)
ENDIF
*查找文件
IF thisform.wildcard THEN
SELECT FileList
ADIR(aFileList,"&cPath.&cFileName","AHRS")
&& 拷贝符合条件的文件名到一个数组
cPathNow = SYS(5)+CURDIR()
IF TYPE("aFileList") <> "U" THEN
cFolderName = "&cPath"
FOR nCopy = 1 TO ALEN(aFileList,1)
IF RIGHT(aFileList[nCopy,5],1)<>"D" THEN
APPEND BLANK
REPLACE Folder WITH cFolderName
REPLACE FileName WITH aFileList[nCopy,1]
ENDIF
ENDFOR
RELEASE aFileList
ENDIF
ELSE
IF FILE("&cPath.&cFileName") THEN
nDrive = 91 &&END FOR LOOP
EXIT && END DO LOOP
ENDIF
ENDIF
*Add more directories to search
SELECT DirList
SET DEFAULT TO "&cPath"
ADIR(aDirList,"","D") && 拷贝所有当前目录到一个数组
cPathNow = SYS(5)+CURDIR()
FOR nCopy = 1 TO ALEN(aDirList,1)
cFolderName = aDirList[nCopy,1]
IF RIGHT(aDirList[nCopy,5],1)="D" AND cFolderName<>"."
THEN
APPEND BLANK
REPLACE Folder WITH "&cPathNow.&cFolderName.\"
ENDIF
ENDFOR
RELEASE aDirList
GO nRecord
bKeepGoing = IIF(nRecord=RECCOUNT(),.F.,.T.)
SKIP
ENDDO
ENDIF
ENDFOR
*CleanUp
SET DEFAULT to "&cStartDir" &&还原到过去的默认值
IF bKeepGoing THEN
cDrivePathFile = "&cPath.&cFileName"
ELSE
cDrivePathFile = ""
ENDIF
SELECT DirList &&删除临时表
USE
IF thisform.wildcard THEN
SELECT FileList && 如果临时表为空则释放它
IF RECCOUNT() = 0 THEN
USE
ENDIF
ENDIF
thisform.result = cDrivePathFile
thisform.visible = .F.
thisform.ButtonCancel =.F.
RETURN cDrivePathFile
ENDPROC
ENDDEFINE
*结束
[返回] |