如何在VB中实现目录遍历

2016-02-19 17:55 56 1 收藏

生活已是百般艰难,为何不努力一点。下面图老师就给大家分享如何在VB中实现目录遍历,希望可以让热爱学习的朋友们体会到设计的小小的乐趣。

【 tulaoshi.com - 编程语言 】

一、API函数的声明、自定义数据类型及常量的定义
  ----注意:API函数的声明应在应用程序的代码模块中进行,且一条声明必须放在一行中'API函数的声明
  PublicDeclareFunctionFindFirstFileLib
  "kernel32"Alias"FindFirstFileA"
  (ByVallpFileNameAsString,
  lpFindFileDataAsWIN32_FIND_DATA)AsLong
  PublicDeclareFunctionFindNextFileLib
  "kernel32"Alias"FindNextFileA"
  (ByValhFindFileAsLong,lpFindFileData
  AsWIN32_FIND_DATA)AsLong
  PublicDeclareFunctionFindCloseLib
  "kernel32"(ByValhFindFileAsLong)AsLong
  
  '最大路径长度和文件属性常量的定义
  PublicConstMAX_PATH=260
  PublicConstFILE_ATTRIBUTE_ARCHIVE=&H20
  PublicConstFILE_ATTRIBUTE_COMPRESSED=&H800
  PublicConstFILE_ATTRIBUTE_DIRECTORY=&H10
  PublicConstFILE_ATTRIBUTE_HIDDEN=&H2
  PublicConstFILE_ATTRIBUTE_NORMAL=&H80
  PublicConstFILE_ATTRIBUTE_READONLY=&H1
  PublicConstFILE_ATTRIBUTE_SYSTEM=&H4
  PublicConstFILE_ATTRIBUTE_TEMPORARY=&H100
  
  '自定义数据类型FILETIME和WIN32_FIND_DATA的定义
  PublicTypeFILETIME
  dwLowDateTimeAsLong
  dwHighDateTimeAsLong
  EndType
  
  PublicTypeWIN32_FIND_DATA
  dwFileAttributesAsLong
  ftCreationTimeAsFILETIME
  ftLastAccessTimeAsFILETIME
  ftLastWriteTimeAsFILETIME
  nFileSizeHighAsLong
  nFileSizeLowAsLong
  dwReserved0AsLong
  dwReserved1AsLong
  cFileNameAsString*MAX_PATH
  cAlternateAsString*14
  EndType
  
  二、去掉固定长度字符串右边的NULL字符(ASCII值为0)和SPACE字符(ASCII值为32)
  ----由于数据类型WIN32_FIND_DATA的cFileName元素为定长数据类型且在执行函数FindFirstFile和FindNextFile后会有NULL字符,因此需去掉其中的无效字符。
  PublicFunctionfDelInvaildChr
  (strAsString)AsString
  OnErrorResumeNext
  Fori=Len(str)To1Step-1
  IfAsc(Mid(str,i,1))
  0AndAsc(Mid(str,i,1))32Then
  fDelInvaildChr=Left(str,i)
  ExitFor
  EndIf
  Next
  EndFunction
  
  三、遍历主函数
  ----参数说明:
  strPathName要遍历的目录
  objList使用VB的内部控
  件ListBox来存放遍历得到的路径,之所以
  不使用字符串数组是因为数组大小不好定义
  
  PublicSubsDirTraversal
  (ByValstrPathNameAsString,ByRefobjListAsListBox)
  DimsSubDir(200)AsString
  '存放当前目录下的子目录,下标可根据需要调整
  DimiIndexAsInteger
  '子目录数组下标
  DimiAsInteger
  '用于循环子目录的查找
  
  DimlHandleAsLong
  'FindFirstFileA的句柄
  DimtFindDataAsWIN32_FIND_DATA'
  DimstrFileNameAsString'文件名
  
  OnErrorResumeNext
  '初始化变量
  i=1
  iIndex=0
  tFindData.cFileName=
  ""'初始化定长字符串
  
  lHandle=FindFirstFile
  (strPathName&"*.*",tFindData)
  IflHandle=0Then'查询结束或发生错误
  ExitSub
  EndIf
  strFileName=fDelInvaildChr(tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then'目录
  IfstrFileName"."AndstrFileName".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName
  &""&strFileName'添加到目录数组
  EndIf
  Else
  objList.AddItemstrPathName
  &""&strFileName
  EndIf
  '循环查找下一个文件,直到结束
  DoWhileTrue
  tFindData.cFileName=""
  IfFindNextFile(lHandle,tFindData)
  =0Then'查询结束或发生错误
  FindClose(lHandle)
  ExitDo
  Else
  strFileName=fDelInvaildChr
  (tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then
  IfstrFileName"."AndstrFileName".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName
  &""&strFileName'添加到目录数组
  EndIf
  Else
  objList.AddItemstrPathName&""&strFileName
  EndIf
  EndIf
  Loop
  '如果该目录下有目录,则根据目录数组递归遍历
  IfiIndex0Then
  Fori=1ToiIndex
  sDirTraversalsSubDir(i),objList
  Next
  EndIf
  EndSub
  
  ----利用以上遍历方法,读者可以根据数据类型WIN32_FIND_DATA的dwFileAttributes、ftCreationTime、ftLastAccessTime、ftLastWriteTime元素来扩充文件查询功能(按文件属性、创建日期、最后修改日期、最后访问日期等不同条件的查询)。
  
  
  
  完整代码:
  
  '''''''''''''''''''''''''''''''''''''''''''
  'API函数的声明、常量、自定义数据类型
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  'API函数的声明
  PublicDeclareFunctionFindFirstFileLib"kernel32"Alias"FindFirstFileA"(ByVallpFileNameAsString,lpFindFileDataAsWIN32_FIND_DATA)AsLong
  PublicDeclareFunctionFindNextFileLib"kernel32"Alias"FindNextFileA"(ByValhFindFileAsLong,lpFindFileDataAsWIN32_FIND_DATA)AsLong
  PublicDeclareFunctionFindCloseLib"kernel32"(ByValhFindFileAsLong)AsLong
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  
  '最大路径长度和文件属性常量的定义
  PublicConstMAX_PATH=260
  PublicConstFILE_ATTRIBUTE_ARCHIVE=&H20
  PublicConstFILE_ATTRIBUTE_COMPRESSED=&H800
  PublicConstFILE_ATTRIBUTE_DIRECTORY=&H10
  PublicConstFILE_ATTRIBUTE_HIDDEN=&H2
  PublicConstFILE_ATTRIBUTE_NORMAL=&H80
  PublicConstFILE_ATTRIBUTE_READONLY=&H1
  PublicConstFILE_ATTRIBUTE_SYSTEM=&H4
  PublicConstFILE_ATTRIBUTE_TEMPORARY=&H100
  
  '自定义数据类型FILETIME和WIN32_FIND_DATA的定义
  PublicTypeFILETIME
  dwLowDateTimeAsLong
  dwHighDateTimeAsLong
  EndType
  
  PublicTypeWIN32_FIND_DATA
  dwFileAttributesAsLong
  ftCreationTimeAsFILETIME
  ftLastAccessTimeAsFILETIME
  ftLastWriteTimeAsFILETIME
  nFileSizeHighAsLong
  nFileSizeLowAsLong
  dwReserved0AsLong
  dwReserved1AsLong
  cFileNameAsString*MAX_PATH
  cAlternateAsString*14
  EndType
  
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  '去掉固定长度字符串右边的NULL字符(ASCII值为0)和SPACE字符(ASCII值为32)函数
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  PublicFunctionfDelInvaildChr(strAsString)AsString
  OnErrorResumeNext
  Fori=Len(str)To1Step-1
  IfAsc(Mid(str,i,1))0AndAsc(Mid(str,i,1))32Then
  fDelInvaildChr=Left(str,i)
  ExitFor
  EndIf
  Next
  EndFunction
  
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  '遍历主函数
  '参数说明:
  'strPathName要遍历的目录
  'objList使用VB的内部控件ListBox来存放遍历得到的路径,之所以
  '不使用字符串数组是因为数组大小不好定义
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  PublicSubsDirTraversal(ByValstrPathNameAsString,ByRefobjListAsListBox)
  DimsSubDir(200)AsString'存放当前目录下的子目录,下标可根据需要调整
  DimiIndexAsInteger'子目录数组下标
  DimiAsInteger'用于循环子目录的查找
  
  DimlHandleAsLong'FindFirstFileA的句柄
  DimtFindDataAsWIN32_FIND_DATA'
  DimstrFileNameAsString'文件名
  
  OnErrorResumeNext
  '初始化变量
  i=1
  iIndex=0
  tFindData.cFileName=""'初始化定长字符串
  
  lHandle=FindFirstFile(strPathName&"*.*",tFindData)
  IflHandle=0Then'查询结束或发生错误
  ExitSub
  EndIf
  strFileName=fDelInvaildChr(tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then'目录
  IfstrFileName"."AndstrFileName".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName&""&strFileName'添加到目录数组
  EndIf
  Else
  objList.AddItemstrPathName&""&strFileName
  EndIf
  '循环查找下一个文件,直到结束
  DoWhileTrue
  tFindData.cFileName=""
  IfFindNextFile(lHandle,tFindData)=0Then'查询结束或发生错误
  FindClose(lHandle)
  ExitDo
  Else
  strFileName=fDelInvaildChr(tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then
  IfstrFileName"."AndstrFileName".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName&""&strFileName'添加到目录数组
  EndIf
  Else
  objList.AddItemstrPathName&""&strFileName
  EndIf
  EndIf
  Loop
  '如果该目录下有目录,则根据目录数组递归遍历
  IfiIndex0Then
  Fori=1ToiIndex
  sDirTraversalsSubDir(i),objList
  Next
  EndIf
  EndSub->

来源:http://www.tulaoshi.com/n/20160219/1616394.html

延伸阅读
VisualBasic作为一个集应用程序开发、测试、查错功能于一体的集成式开发环境,越来越受到程序员的青睐。笔者在开发某数据库维护系统的过程中,选择了VB5.0作为开发平台,Unix作为服务器端操作系统,Informix作为服务器数据库。 问题的出现 在开发该维护系统的过程中,注意到Informix数据库的字段类型CLOB填入数据时需要函数FILETOCLOB("FILEN...
在多媒体程序设计中,为了美化显示屏幕,增加画面的动感,常常要用天各种图像显示特技。图像的切换技术能明显美化画面。用VisualBasic编制这类程序时,由于VB自身没有这种切换功能,因此需要利用第三方控件或调用WindowsAPI函数BitBlt来实现这种功能。本文介绍用BitBlt函数实现画面的各种切换方法,供大家参考。 假设有5个图像文件(Picture...
----毫不夸张的说,注册表相当于WIN95的“心”,几乎所有的Windows应用程序都毫不例外的要在这里边“安家筑巢”,如果你也用VB编写了一个程序,是不是也想在注册表里占有一席之地呢(即使刚才没有,现在大概也有了吧)?嗯,听我慢慢道来。 ----“API”中专门提供了处理注册表的函数,不用说也知道,它们肯定功能强大(因为它们是API)...
       一、Java中的远程方法调用 远程方法调用(Remote Method Invocation, RMI)是Java1.1引入的分布式对象软件包,它的出现简化了在多台机器上的Java应用之间的通信。相比CORBA,RMI功能较弱且只能用于Java系统。 二、实现一个简单的RMI 要使用RMI,必须构造四个主要的类:远...
在平常的办公中,经常碰到需要在Word中求和的情况,而用过Excel的朋友都知道,在Excel的常用工具栏中有一个〔自动求和〕按钮很方便。其实,在Word 2003的表格中,也可以使用〔自动求和〕按钮,当然,这需要想办法把〔自动求和〕按钮调出来才行,其方法是: 1. 在“工具”菜单中单击“自定义”命令。 2. 选择“命令...

经验教程

616

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部