含子目录的搜寻档案.doc

上传人:laozhun 文档编号:2388157 上传时间:2023-02-17 格式:DOC 页数:6 大小:17.50KB
返回 下载 相关 举报
含子目录的搜寻档案.doc_第1页
第1页 / 共6页
含子目录的搜寻档案.doc_第2页
第2页 / 共6页
含子目录的搜寻档案.doc_第3页
第3页 / 共6页
含子目录的搜寻档案.doc_第4页
第4页 / 共6页
含子目录的搜寻档案.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《含子目录的搜寻档案.doc》由会员分享,可在线阅读,更多相关《含子目录的搜寻档案.doc(6页珍藏版)》请在三一办公上搜索。

1、含子目录的搜寻档案 标题:非递回、无使用界面的档案搜寻一般来说,搜寻目录及子目录底下符合条件之所有档案功能的程式撰写,一向颇令人头疼,而最後的解决方式多用Recursive(程式递回呼叫)来解决,像所附的范例,就是FileListBox和Recursive程序的兼用,来解决这个问题。本范例则用另一种思考模式切入,在不使用任何OCX及Recursive程序下利用两个非固定阵列变数及双层Do.Loop回圈解决这问题。本范例代表的含意是你把这段Code搬到无使用者可视界面的Module及Class里,一样可以执行(程式里的ListBox及MsgBox只是为了解说方便而已,实际的资料已放入FilePa

2、ckage这个动态阵列里,可以Index取用。)当然你不能拿Windows95提供的寻找功能的搜寻速度来要求本范例,因为那根本是两种不同的驱动方式,但我用c:为搜寻启始目录,以*.*为条件来与的范例程式相比,是2分钟,我是分钟。更值得一提的是,其实整个搜寻动作在55秒时已全部完成,剩下的时间都是用来显示ListBox资料。所以如果你的程式并不需要立即的显示查询结果,那麽本范例将比更适合你使用。最後如果你觉得本程式有任何错误或有改进的意见,请写信给站长,站长会转信给我,在此先谢谢你了。NeedaListBox,CommandBoxOptionExplicit宣告搜寻到的档案的储存阵列变数Priv

3、ateFilePackage()AsStringPrivateSubCommand1_Click()宣告存放目录名称储存阵列变数DimDirPackage()AsString存放档案搜寻条件之字串DimSearchStringAsString接收Dir()传回字串,并做为回圈判断的字串DimDirStringAsStringI目前搜寻目录的指位器,J是DirPackage目录阵列之上限指标K是FilePackage之档案阵列之上限指标DimIAsLong,JAsLong,KAsLong把ListBox的旧显示资料清掉把FilePackage的上一次搜寻资料清掉EraseFilePackage假

4、设我们的搜寻从C碟根目录开始ReDimDirPackage(0)路径结尾一定要加DirPackage(0)=c:假设我们的搜寻字串是*.exeSearchString=*.exe显示沙漏指标=11-以下搜寻C碟里所有的目录-直到目录指位器I超过目录上限指标J才结束搜寻DoWhileI<=J搜寻目录指位器I所指的目录DirString=Dir(DirPackage(I),vbHiddenOrvbDirectoryOrvbReadOnlyOrvbSystem)直到目前目录找不到任何目录或档案才结束DoWhileDirString<>不要把上层目录和现目录的指标符号算进去IfDir

5、String<>.AndDirString<>.Then如果找到的是个目录If(GetAttr(DirPackage(I)&DirString)AndvbDirectory)_=vbDirectoryThen把目录上限加1J=J+1把储存目录名称的阵列加一个ReDimPreserveDirPackage(J)把查到的新目录放在DirPackage新元素里DirPackage(J)=DirPackage(I)+DirString+如果找到的是个档案Else如果与搜寻字串相符合IfUCase(DirString)LikeUCase(SearchString)Then

6、把储存档案名称的阵列加一个ReDimPreserveFilePackage(K)把查到的新档案放在filePackage新元素里FilePackage(K)=DirPackage(I)+DirString把档案上限加1K=K+1EndIfEndIfEndIf继续找是否有符合的资料,并把结果放DirString里DirString=DirDoEventsLoop把现目录指标往下移一个I=I+1Loop-以下将结果输出到列示盒里-以下为找到档案之总计-还原滑鼠指标=0IfK=0ThenMsgBox没有&SearchString&的档案Else以下将结果输出到列示盒里ForI=0To

7、UBound(FilePackage)(I)DoEventsNextMsgBox总共找到&UBound(FilePackage)+1&个档案EndIfEndSub以下有Recursive作法,本人测试发现Recursive的作法略快一些,原因可能出在ReDimPreserveDirPackage与ReDimPreservesDirectoryList上,前者一直动态新增目录字串(如果c:之下含目录下的子目录一共100个,那这个阵列便会有100的大小),而後者Recursive的作法则不同,它动态目录的最大值则是含有最大子目录数的那个目录中,子目录之数目(如:c:windows中

8、含最多子目录,其子目录有30个,且这30个是不含子目录下的子目录,则动态字串阵列的最大个数便只有30)NeedaCommandBoxPrivateFoundFile()asString存放传回值的字串阵列PrivatentxAsLongPrivateSubCommand1_Click()ntx=0CallGetDirPath(c:,*.ini)EndSubPrivateSubGetDirPath(CurrentPathAsString,ByValSearFileAsString)DimnIAsInteger,nDirectoryAsInteger,iAsLongDimsFileNameAsSt

9、ring,sDirectoryList()AsStringFirstlistallnormalfilesinthisdirectorysFileName=Dir(CurrentPath,vbHiddenOrvbDirectoryOrvbReadOnlyOrvbSystem)DoWhilesFileName<>IfUCase(sFileName)LikeUCase(SearFile)Theni=GetAttr(CurrentPath+sFileName)If(iAndvbDirectory)=0ThenReDimPreserveFoundFile(ntx)FoundFile(ntx)

10、=CurrentPath+sFileNamentx=ntx+1EndIfEndIfIfsFileName<>.AndsFileName<>.ThenIgnorenondirectoriesIfGetAttr(CurrentPath&sFileName)_AndvbDirectoryThennDirectory=nDirectory+1ReDimPreservesDirectoryList(nDirectory)sDirectoryList(nDirectory)=CurrentPath&sFileNameEndIfEndIfsFileName=DirLoopRecursivelyprocesseachdirectoryFornI=1TonDirectoryGetDirPathsDirectoryList(nI)&,SearFileNextnI

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号