vb.net用api搜索文件却找不到任何文件,问题出在哪里?

清风不拂面 2020-08-22 11:14:34
Public Structure Win32FindData
Dim dwFileAttributes As Long '文件属性
Dim ftCreationTime As ComTypes.FILETIME '文件创建时间
Dim ftLastAccessTime As ComTypes.FILETIME '文件最后一次访问时间
Dim ftLastWriteTime As ComTypes.FILETIME '文件最后一次修改时间
Dim nFileSizeHigh As Long '文件长度高32位
Dim nFileSizeLow As Long '文件长度低32位
Dim dwReserved0 As Long '系统保留
Dim dwReserved1 As Long '系统保留
Dim cFileName As String ' *MAX_PATH'长文件名
Dim cAlternate As String '*14'8.3格式文件名
End Structure

<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function FindFirstFileA(ByVal pFileName As String, ByRef pFindFileData As Win32FindData) As IntPtr
End Function

'<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function FindNextFileA(ByRef hndFindFile As IntPtr, ByRef pFindFileData As Win32FindData) As IntPtr
End Function
'<DllImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function FindClose(ByRef hndFindFile As IntPtr) As IntPtr
End Function


Public Sub getFilesInDirsApi(ByVal strSearchPath As String, ByVal strSearchExt As String, ByVal strSearchKey As String)

Dim wfdFiles As New Win32FindData
Dim inpSearch As IntPtr '搜索句柄变量
Dim INVALID_HANDLE_VALUE As IntPtr = New IntPtr(-1)
Dim listResult As New List(Of String)

'查找第一个文件
inpSearch = FindFirstFileA(strSearchPath & "*.*", wfdFiles)
If inpSearch <> INVALID_HANDLE_VALUE Then

If wfdFiles.dwFileAttributes <> FileAttributes.Directory Then '不是目录
strFileName = wfdFiles.cFileName
strFileExt = Strings.Right(strFileName, strFileName.Length - Strings.InStrRev(strFileName, ".") + 1)
If strFileExt <> "" AndAlso strSearchExt.Contains(strFileExt) Then
listResult.Add(strSearchPath & strFileName)
End If
Else
getFilesInDirsApi(strSearchPath, strSearchExt, strSearchKey)
End If
'查找后面的文件
While FindNextFileA(inpSearch, wfdFiles)
If wfdFiles.dwFileAttributes <> FileAttributes.Directory Then '不是目录
strFileName = wfdFiles.cFileName
strFileExt = Strings.Right(strFileName, strFileName.Length - Strings.InStrRev(strFileName, ".") + 1)
If strFileExt <> "" AndAlso strSearchExt.Contains(strFileExt) Then
listResult.Add(strSearchPath & strFileName)
End If
Else
getFilesInDirsApi(strSearchPath, strSearchExt, strSearchKey)
End If
End While
end sub
...全文
12723 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
清风不拂面 2020-08-25
  • 打赏
  • 举报
回复
没找到FindFirstFileW的数据类型,用了原来FindFirstFileA的类型,同样的问题。用了win10+64位,好象很多API不能用了。
八爻老骥 2020-08-23
  • 打赏
  • 举报
回复
用FindFirstFileW试试。
清风不拂面 2020-08-23
  • 打赏
  • 举报
回复
根据测试,不能查找根目录,只能查找程序所在当前目录,查msdn明明可以的,难道c语言可以,到vb这里就不行了? 测试了c:\*.*,c:\\*.*,c:\*,c:\\*都不行,SetCurrentDirectory(strpath)也不成功,怎么这么坑啊? 测试*.*得到的文件结果是.,继续下一文件就直接结束了 测试.\\*.*,终于得到一个目录,继续下一文件又结束了 晕死了
无语无 2020-08-23
  • 打赏
  • 举报
回复
用其他的试试
VB 超强的API浏览器,带源码。   在VB.net、C#中, 使用 DllImport 属性调用 Windows API, 请先使用 Imports 或 using 导入 System.Runtime.InteropServices 以简化声明的引用。 对于Any类型的转换,VB.NET/C# 中不支持Any类型。如果你要把VB6式的API声明添加为VB.NET/C#支持的声明方式, 请使用特定的类型。在本软件中对于有Any类型的函数添加时会提示你选择一种类型。在 Visual Basic 6.0 中, Any类型的变量通常用于传递是字符串或 Null 的变量, 您可以通过声明两种(一种使用长型,一种使用字符串)来替换这种 Visual Basic 6.0 的用法。 易语言的函数、类型、常数声明是放在不同的地方的,不用分别复制, 只需全部复制, 任意粘贴到Dll命令、常量表、自定义数据类型声明处, 易语言会自动分开几种类型。 在声明C#结构体时如果结果体中有数值数组类型, 结构体中的这个成员会被声明成不安全代码, 若要正确编译代码 ,请在单击VS.net中“项目”菜单“属性”菜单项, 在来的选项卡上选择“生成”, 选中那个选项卡中的“允许不安全代码”项复选项, 这样才能正确编译。 VB.net与C#中不支持类型(结构体)的某个变量同时是定长字符串与数组, 两者只能选其一。请自行计算数组大小或用代码处理定长字符串的方式进行改写。   VB.net与C#中的类型(结构体)如果有数组那么这个类型不能声明为类。

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧