手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

如何在VB中实现目录遍历

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 一、API 函 数 的 声 明、 自 定 义 数 据 类 型 及 常 量 的 定 义

  注 意:API 函 数 的 声 明 应 在 应 用 程 序 的 代 码 模 块 中 进 行, 且 一 条 声 明 必 须 放 在 一 行 中'API 函 数 的 声 明

  Public Declare Function FindFirstFile Lib

   "kernel32" Alias "FindFirstFileA"

   (ByVal lpFileName As String,

   lpFindFileData As WIN32_FIND_DATA) As Long

  Public Declare Function FindNextFile Lib

   "kernel32" Alias "FindNextFileA"

   (ByVal hFindFile As Long, lpFindFileData

   As WIN32_FIND_DATA) As Long

  Public Declare Function FindClose Lib

   "kernel32" (ByVal hFindFile As Long) As Long

   '最大路径长度和文件属性常量的定义

  Public Const MAX_PATH = 260

  Public Const FILE_ATTRIBUTE_ARCHIVE = &H20

  Public Const FILE_ATTRIBUTE_COMPRESSED = &H800

  Public Const FILE_ATTRIBUTE_DIRECTORY = &H10

  Public Const FILE_ATTRIBUTE_HIDDEN = &H2

  Public Const FILE_ATTRIBUTE_NORMAL = &H80

  Public Const FILE_ATTRIBUTE_READONLY = &H1

  Public Const FILE_ATTRIBUTE_SYSTEM = &H4

  Public Const FILE_ATTRIBUTE_TEMPORARY = &H100

  '自定义数据类型FILETIME和WIN32_FIND_DATA的定义

  Public Type FILETIME

  dwLowDateTime As Long

  dwHighDateTime As Long

  End Type

  Public Type WIN32_FIND_DATA

   dwFileAttributes As Long

   ftCreationTime As FILETIME

   ftLastAccessTime As FILETIME

   ftLastWriteTime As FILETIME

   nFileSizeHigh As Long

   nFileSizeLow As Long

   dwReserved0 As Long

   dwReserved1 As Long

   cFileName As String * MAX_PATH

   cAlternate As String * 14

  End Type

  二、 去 掉 固 定 长 度 字 符 串 右 边 的NULL 字 符(ASCII 值 为0) 和SPACE 字 符(ASCII 值 为32)

  由 于 数 据 类 型WIN32_FIND_DATA 的cFileName 元 素 为 定 长 数 据 类 型 且 在 执 行 函 数FindFirstFile 和FindNextFile 后 会 有NULL 字 符, 因 此 需 去 掉 其 中 的 无 效 字 符。

  Public Function fDelInvaildChr

   (str As String) As String

   On Error Resume Next

   For i = Len(str) To 1 Step -1

    If Asc(Mid(str, i, 1)) < > 0 And Asc(Mid(str, i, 1)) <> 32 Then

     fDelInvaildChr = Left(str, i)

     Exit For

    End If

   Next

  End Function

  三、 遍 历 主 函 数

  参 数 说 明:

  strPathName要遍历的目录

  objList 使用VB的内部控件ListBox来存放遍历得到的路径,之所以不使用字符串数组是因为数组大小不好定义

  Public Sub sDirTraversal

   (ByVal strPathName As String, ByRef objList As ListBox)

   Dim sSubDir(200) As String

   '存放当前目录下的子目录,下标可根据需要调整

   Dim iIndex As Integer

   '子目录数组下标

   Dim i As Integer

   '用于循环子目录的查找

   Dim lHandle As Long

   'FindFirstFileA的句柄

   Dim tFindData As WIN32_FIND_DATA '

   Dim strFileName As String '文件名

   On Error Resume Next

   '初始化变量

   i = 1

   iIndex = 0

   tFindData.cFileName =

   "" '初始化定长字符串

   lHandle = FindFirstFile

   (strPathName & "\*.*", tFindData)

   If lHandle = 0 Then '查询结束或发生错误

    Exit Sub

   End If

   strFileName = fDelInvaildChr(tFindData.cFileName)

   If tFindData.dwFileAttributes = &H10 Then '目录

    If strFileName <> "." And strFileName <> ".." Then

     iIndex = iIndex 1

     sSubDir(iIndex) = strPathName

     & "\" & strFileName '添加到目录数组

    End If

   Else

    objList.AddItem strPathName

    & "\" & strFileName

   End If

   '循环查找下一个文件,直到结束

   Do While True

    tFindData.cFileName = ""

    If FindNextFile(lHandle, tFindData) = 0 Then '查询结束或发生错误

     FindClose (lHandle)

     Exit Do

    Else

     strFileName = fDelInvaildChr(tFindData.cFileName)

     If tFindData.dwFileAttributes = &H10 Then

      If strFileName <> "." And strFileName <> ".." Then

       iIndex = iIndex 1

       sSubDir(iIndex) = strPathName & "\" & strFileName '添加到目录数组

      End If

     Else

      objList.AddItem strPathName & "\" & strFileName

     End If

    End If

   Loop

   '如果该目录下有目录,则根据目录数组递归遍历

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!