如何得到一个目录的所有文件的文件名

lwz2001 2001-12-02 09:11:21
一定给分!!!!!!!
...全文
69 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwz2001 2001-12-02
  • 打赏
  • 举报
回复
如何给分啊!这系统也太破!
DeityFox 2001-12-02
  • 打赏
  • 举报
回复
如果目录下还包含子目录,以上程式就无用武之地咯
偶转贴一片
以下是老怪兄所作的None Recursive的作法。感谢老怪提供的程式

标题:非递归、无使用界面的文件搜寻

一般来说,搜寻目录及子目录底下符合条件之所有文件功能的程式撰写,一向
颇令人头疼,而最后的解决方式多用 Recursive(程式递归呼叫) 来解决,像 VB5.0
所附的 WinSeek.vbp 范例,就是 FileListBox 和 Recursive 程序的兼用,来解决
这个问题。

本范例则用另一种思考模式切入,在不使用任何 OCX 及 Recursive 程序下利
用两个非固定阵列变数及双层 Do...Loop 回圈解决这问题。本范例代表的含意是你
把这段 Code 搬到无使用者可视界面的 Module 及 Class ,一样可以执行(程式
的 ListBox 及 MsgBox 只是为了解说方便而已,实际的资料已放入 FilePackage 这
个动态阵列 ,可以 Index 取用。)

当然你不能拿 Windows95 提供的[寻找]功能的搜寻速度来要求本范例,因为
那根本是两种不同的驱动方式,但我用 "c:\" 为搜寻启始目录,以 "*.*" 为条件来
与 VB5.0 的范例程式 WinSeek.vbp 相比,WinSeek.vbp 是 2 分钟,我是 2.5 分钟
。更值得一提的是,其实整个搜寻动作在 55 秒时已全部完成,剩下的时间都是用来
显示 ListBox 资料。所以如果你的程式并不需要立即的显示查询结果,那麽本范例
将比 WinSeek.vbp 更适合你使用。

最后如果你觉得本程式有任何错误或有改进的意见,请写信给站长,站长会转
信给我,在此先谢谢你了。

老怪 上

' Need a ListBox, CommandBox
Option Explicit

'宣告搜寻到的文件的储存阵列变数
Private FilePackage() As String

Private Sub Command1_Click()
'宣告存放目录名称储存阵列变数
Dim DirPackage() As String
'存放文件搜寻条件之字串
Dim SearchString As String
'接收 Dir() 传回字串,并做为回圈判断的字串
Dim DirString As String
'I 目前搜寻目录的指位器,J 是 DirPackage 目录阵列之上限指标
'K 是 FilePackage 之文件阵列之上限指标
Dim I As Long, J As Long, K As Long

'把 ListBox 的旧显示资料清掉
List1.Clear

'把 FilePackage 的上一次搜寻资料清掉
Erase FilePackage

'假设我们的搜寻从 C 碟根目录开始
ReDim DirPackage(0)
'路径结尾一定要加 "\"
DirPackage(0) = "c:\"

'假设我们的搜寻字串是 "*.exe"
SearchString = "*.exe"

'显示沙漏指标
Me.MousePointer = 11

'-------- 以下搜寻 C 碟 所有的目录 -----------------

'直到目录指位器 I 超过目录上限指标 J 才结束搜寻
Do While I <= J

'搜寻目录指位器 I 所指的目录
DirString = Dir(DirPackage(I), vbHidden Or vbDirectory Or vbReadOnly Or vbSystem)

'直到目前目录找不到任何目录或文件才结束
Do While DirString <> ""

'不要把上层目录和现目录的指标符号算进去
If DirString <> "." And DirString <> ".." Then

'如果找到的是个目录
If (GetAttr(DirPackage(I) & DirString) And vbDirectory) _
= vbDirectory Then
'把目录上限加 1
J = J + 1
'把储存目录名称的阵列加一个
ReDim Preserve DirPackage(J)
'把查到的新目录放在 DirPackage 新元素
DirPackage(J) = DirPackage(I) + DirString + "\"

'如果找到的是个文件
Else
'如果与搜寻字串相符合
If UCase(DirString) Like UCase(SearchString) Then
'把储存文件名称的阵列加一个
ReDim Preserve FilePackage(K)
'把查到的新文件放在 filePackage 新元素
FilePackage(K) = DirPackage(I) + DirString
'把文件上限加 1
K = K + 1
End If
End If

End If

'继续找是否有符合的资料,并把结果放 DirString
DirString = Dir
DoEvents
Loop

'把现目录指标往下移一个
I = I + 1
Loop

'-------- 以下将结果输出到列示盒 -----------------


'-------- 以下为找到文件之总计 -----------------


'还原鼠标指标
Me.MousePointer = 0

If K = 0 Then
MsgBox "没有 " & SearchString & " 的文件"
Else
'以下将结果输出到列示盒
For I = 0 To UBound(FilePackage)
List1.AddItem FilePackage(I)
DoEvents
Next

MsgBox "总共找到 " & UBound(FilePackage) + 1 & " 个文件"

End If

End Sub
enmity 2001-12-02
  • 打赏
  • 举报
回复
to:HowardOK(小B) 
呵呵,谢谢。

其实,VB本身的函数能够解决大部分的常规操作,如果内置函数可以理想地解决问题,我们就不必动用API了。假如不能满足,我们可以使用API帮忙。
HowardOK 2001-12-02
  • 打赏
  • 举报
回复
楼上的方法,简单,方便!!!
enmity 2001-12-02
  • 打赏
  • 举报
回复
简单点:
iValue = Dir("c:\windows\*.*")
'Debug.Print iValue
Init = 0
Do While iValue <> ""
Debug.Print ivalue
iValue = Dir()
Loop

还可以用filelist控件。

当然,还可以用API,类似的帖子很多,请搜索一下
相关推荐
发帖
VB基础类

7681

社区成员

VB 基础类
社区管理员
  • VB基础类社区
加入社区
帖子事件
创建了帖子
2001-12-02 09:11
社区公告
暂无公告