答案:
如何在VB中实现目录遍历 |
一、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 '如果该目录下有目录,则根据目录数组递归遍历 If iIndex > 0 Then For i = 1 To iIndex sDirTraversal sSubDir(i), objList Next End If End Sub ---- 利 用 以 上 遍 历 方 法, 读 者 可 以 根 据 数 据 类 型WIN32_FIND_DATA 的dwFileAttributes、ftCreationTime、ftLastAccessTime、ftLastWriteTime 元 素 来 扩 充 文 件 查 询 功 能( 按 文 件 属 性、 创 建 日 期、 最 后 修 改 日 期、 最 后 访 问 日 期 等 不 同 条 件 的 查 询)。 完 整 代 码 : ''''''''''''''''''''''''''''''''''''''''''' '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)函数 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 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(strP 上一个:Windows 初始化文件的修改 更多图片编程知识:
访问www.zzzyk.com 试试 CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络, |