版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。
又翻出来很早前的一篇vb的文章,写的简单,没什么用,大家看看就可以了。

Vb编程中,可以通过使用控件DriveListBox 、DirListBox和FileListBox的组合,来得到某个目录下的文件或文件夹,继而可以通过递归调用来得到磁盘上所有的文件或文件夹,但是,如果可以仅通过一个函数就能完成以上的工作,何乐而不为?

第一部分:Dir函数
    语法:Dir[(pathname[, attributes])]
    作用:返回一个 String,用以表示一个文件名、目录名或文件夹名称。
    参数说明:
    pathname:字符串,要查找的文件所在目录名称;
    attributes:常数,指定了文件的属性。数值和描述见下:
    常数   值    描述
    vbNormal 0 (缺省)   没有属性的文件
    VbReadOnly 1    只读文件
    vbHidden  2    隐藏文件
    VbSystem  4    系统文件
    vbVolume  8    卷标文件
    vbDirectory  16    无属性文件及其路径和文件夹

在使用中,我们可以使用通配符来制定要查找的文件,比如:
    dir("c:\*.txt")  返回C盘下后缀名为”txt”的文件;
    dir("c:\?est.txt") 返回C盘下后缀名为”txt”,文件名四个字符且包含”est”的文件。
    关键点:1、要得到其它匹配 pathname 的文件名,可再次调用 Dir,且不要使用参数;
    2、如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("");
    3、Dir返回的文件或文件名是无序的。

第二部分:递归调用
    从第一部分我们可以看出,如果我们先使用一个带有Pathname参数的Dir函数,然后不断使用不带参数的Dir函数,那么我们就可以获得查找目录下的所有的文件或文件夹。
    比如
FileName = Dir(“C:\”, vbDirectory)
If FileName <> "" Then
   Do While FileName <> "" ‘获得的文件名不是空字符串的话继续执行
      Dosomething  ‘这里是调用处理过程
      FileName = Dir  ‘调用无参Dir函数
   Loop
End If

第三部分:简单图形界面
    在程序中,不仅仅是后台程序,更重要的还有图形界面。
    这里使用StatusBar控件、ImageList控件、TreeView控件和ListView控件将写入文本中保存的目录和文件显示出来。
    由于以上几个控件不是默认的控件,要使用这几个控件,应该使用菜单“工程\部件”,然后在“控件”选项卡中选择“Microsoft Windows Common Controls 6.0”,单击“确定”,这四个控件就被加入到了工具箱中。
    我们在FormMain中放置一个StatusBar控件、两个ImageList控件、一个TreeView控件和一个ListView控件,具体放置如下图所示:

    ImageList1用于TreeView1中显示图片,图像的大小为16×16,图像主要用到了以下几个:

    ImageList2用于ListView1中显示图片,图像大小为32×32,图像用到了以下几个:

    设置TreeView1控件的图像列表为ImageList1;设置ListView1控件的普通图像列表为ImageList2,小图标列表为ImageList1。
    (一)StatusBar控件的简单使用
    在StatusBar1控件上点击鼠标右键,选择“属性”。在“通用”选项卡中选择“样式”为“0 - sbrNormal”(多窗格样式)。在“窗格”选项卡中,通过“插入窗格”共建立了四个窗格,其中索引1、3号窗格的文本分别为:“包含目录”、“包含文件”;2、4号窗格的文本为空,在编程的时候可以这样设定某个窗格的文本:
StatusBar1.Panels(Index).Text = “这里是设定的文本” ‘Index对应设定的索引号

(二)TreeView控件的简单使用
    在TreeView1控件中添加一个节点的方法如下:
TreeView1.Add(relative, relationship, key, text, image, selectedimage)
    用法可参看Msdn :《Add 方法(Nodes 集合)》一节。在程序中可以这样使用:
Dim nodX As Node  
‘声明 Node 变量。

Set nodX = TreeView1.Nodes.Add(, , "r", "Root",1,2)
‘第一个节点,文本为”Root”,”r”是这个节点的标识字符串,
‘1是在关联的ImageList控件中的图像的索引,2是在 Node 被选中时显示的图像索引。

Set nodX = TreeView1.Nodes.Add("r", tvwChild, "child1", "Child",3,4)
‘这个节点是节点1 ("Root") 的子节点,其中”r”是关联节点的标识字符串,
‘tvwChild是此节点和节点1之间的关联方式(子节点),
‘文本为”Child”,”child1”是这个节点的标识字符串

另外,我们在程序中还要用到Treeview控件中Node对象的Tag属性,它可以帮助该节点记录额外的数据:
NodX.Tag = “额外数据”

(三)ListView控件的简单使用
    设置ListView1控件的外观:
ListView1.View=Value
‘Value有四个值,默认是lvwIcon 0(图标),即显示为图标和文本标签模式。

在ListView1控件中添加对象的方法如下:
ListView.ListItems.Add.Add(index, key, text, icon, smallIcon)
    程序中可以这样使用:
Dim ItmX As ListItem
Set ItmX = ListView1.ListItems.Add(, , “显示文本”, 1, 2)

第四部分:文件读写操作
    文件的写操作:
Open Filename For Output As #1
Print #1, “写入的数据”
Close #1

文件的读操作:
Open Filename For Input As #2
    Line Input #2, SaveLine
Close #2

另外需要重点提及Seek 函数和Seek 语句:
    Seek函数可以返回文件当前读写的位置:Seekpos = Seek(filenumber)
    Seek语句可以设置文件当前读写的位置:Seek #filenumber, SeekPos

第五部分:主要程序分析
    程序包含一个模块(Model1)和一个窗体(FormMain)。
    在程序中采用如下方式存放文件:
    <S>文件夹全路径
    <D>文件夹名
    <F>文件名
    主程序以及说明如下:

Model1部分:
Public Declare Function timeGetTime Lib "winmm.dll" () As Long 
‘返回从Windows开始启动经过的毫秒数

Sub main()
FormMain.Show  ‘显示主窗体
End Sub

Public Sub CreateList(DirPath As String) ‘创建文件列表到文件
Dim FileName As String
Dim DirnamePath() As String  ‘记录目录的全路径
Dim DirName() As String  ‘记录目录的名称
Dim DirCount As Integer  ‘也就是DirnamePath()、DirName() 中的个数
Dim i As Integer

DirCount = 0     
ReDim DirName(DirCount)  
ReDim DirnamePath(DirCount)

'If Right(DirPath, 1) = "\" Then DirPath = Left(DirPath, Len(DirPath) - 1) 
‘开始本来有这个防止传入不带”\”的路径,后来改在函数调用的之前处理这个问题

Print #1, "<S>" & DirPath  
‘<S>表示目录全路径;<D>表示目录名称;<F>表示文件名称
‘其中,文件名称和目录名称不要求全路径

DirPath = DirPath & "\" 
'如果给出的路径不带"\",那么就加上,但在实际过程中不用判断,直接加上

FileName = Dir(DirPath, vbDirectory)
‘这里调用Dir函数获得第一个匹配的文件或目录名。
‘需要注意的是:Dir每次返回的文件或目录名并不是按照某个次序返回
‘参数vbDirectory:指定无属性文件及其路径和文件夹。
‘想得到其它匹配的文件或目录名,再一次调用无参Dir()

If FileName <> "" Then
        Do While FileName <> ""
            If Left(FileName, 1) <> "." Then ‘防止”.”或者”..”
                If (GetAttr(DirPath & FileName) And vbDirectory) <> 16 Then
                '如果不是文件夹的话
                    Print #1, "<F>" & FileName
                Else
                    If DirName(0) <> "" Then     '如果DirName(0)已经使用
                        DirCount = DirCount + 1 ‘使数组下标加一
                        ReDim Preserve DirName(DirCount) 
                        ReDim Preserve DirnamePath(DirCount) 
                    End If
                    DirName(DirCount) = "<D>" & FileName  
                    DirnamePath(DirCount) = DirPath & FileName 
                End If
            End If
            FileName = Dir   ‘调用无参Dir函数
        Loop
    End If
   
    If DirName(0) <> "" Then       '如果dirName(0)中有信息,那么就执行以下语句
        For i = 0 To DirCount   ‘循环1
            Print #1, DirName(i)  ‘这里是将得到的目录写入文件,与循环2分开
        Next
        For i = 0 To DirCount   ‘循环2
            Call CreateList(DirnamePath(i)) ‘递归调用 CreateList 函数
        Next
    End If
'    For i = 0 To DirCount   ‘这里是循环1和循环2的结合,造成的错误是
'        Print #1, DirName(i)   ‘写入一个目录,然后调用递归函数,
'        Call CreateList(DirName(i))  ‘结果得到的文件内容与我们期待的不同
'    Next
End Sub

FormMain部分:
Private Sub MnuCreate_Click()      ‘创建文件
'Dim atime1 As Long    ‘返回从Windows开始启动经过的毫秒数
‘Dim atime2 As Long    ‘返回从Windows开始启动经过的毫秒数
‘atime = timeGetTime    ‘这里是我用来测试写入文件所用时间
Open App.Path & "\dirlist.txt" For Output As #1 ‘这里假设是存在程序目录下的dirlist.txt
Call CreateList("c:")      
'注意,这里传递不带"\"的参数,在CreateList中将会处理”\”。
Close #1
‘atime2 = timeGetTime
' MsgBox (atime2 - atime1)   ‘显示写入文件耗时,这里实际耗时769ms,
‘以我的C盘为例,包含23330个文件;1721个文件夹
‘其中未包含系统以及隐藏文件或文件夹
‘生成文件大小266,429字节
MsgBox "create file ok"    ‘提示创建文件成功
End Sub

Private Sub MnuFileRead_Click()
Dim ReadLine As String    ‘ 从文件中读入一行的数据存放在此
Dim ReadHead As String   
Dim ReadMid As String
Dim ReadEnd As String
Dim ReadPos As Integer
Dim NodX As Node
Dim Seekpos As Long

Open "D:\vbsavenew\file\dirlist.txt" For Input As #2 ‘打开文件
    Line Input #2, ReadLine    ‘读入文件第一行,这里是最初的目录路径
Set NodX = TreeView1.Nodes.Add( ,tvwFirst, Mid(ReadLine, 4, Len(ReadLine) - 3) & "\", Mid(ReadLine, 4, Len(ReadLine) - 3), 4, 5)

Seekpos = Seek(2)         
‘定位目录全路径在文件中的字节位置
‘这里将给我们在ListView1中显示文件和目录提供方便
    NodX.Tag = Seekpos         '把Seekpos记录到Tag ,方便以后调用
   
    Do Until EOF(2)     ‘读入文件直到文件结尾
        Line Input #2, ReadLine   ‘仍然是按每一行的方式读入
        Seekpos = Seek(2)    ‘记录位置
        ReadHead = Left(ReadLine, 3) ‘
        Select Case ReadHead
            Case "<S>"    ‘如果是<S>的话才做处理
                ReadPos = InStrRev(ReadLine, "\") 
                ReadMid = Mid(ReadLine, 4, ReadPos - 3)
                ReadEnd = Right(ReadLine, Len(ReadLine) - ReadPos)
                Set NodX = TreeView1.Nodes.Add(ReadMid, tvwChild, ReadMid & ReadEnd & "\", ReadEnd, 4, 5)
    ‘
                NodX.Tag = Seekpos '把Seekpos记录到Tag ,方便以后调用
            Case "<D>"    ‘不做处理
               
            Case "<F>"    ‘不做处理
               
        End Select
    Loop
Close #2     ‘关闭文件
End Sub

Private Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)
‘当TreeView1上的某个节点被鼠标点击时
Dim SeekFile As Long     ‘文件读取位置
Dim ReadLine1 As String
Dim ReadHead1 As String
Dim GetFD As String         '获得文件或目录名
Dim ItmX As ListItem
Dim DirCount As Long     ‘记录目录数目
Dim FileCount As Long     ‘记录文件数目

ListView1.ListItems.Clear    ‘清除ListView1中的原有项目
SeekFile = Node.Tag     ‘这里就要用到Node.Tag中记录的位置了
If Node.Expanded = True Then Node.Expanded = False Else Node.Expanded = True
Me.Caption = Node.FullPath    ‘设置窗体的Caption为点击节点的全路径
Open App.Path & "\dirlist.txt" For Input As #3  ‘打开文件
    Seek #3, SeekFile     ‘指定文件读取位置
       Do Until EOF(3)    ‘读入文件直到文件结尾
        Line Input #3, ReadLine1  ‘读入一行数据
        ReadHead1 = Left(ReadLine1, 3) ‘获得标记
        GetFD = Right(ReadLine1, Len(ReadLine1) - 3)
        Select Case ReadHead1
            Case "<S>"    ‘如果是全路径
                Close #3    ‘关闭打开的文件
                StatusBar1.Panels(2).Text = DirCount ‘显示文件夹数目
                StatusBar1.Panels(4).Text = FileCount ‘显示文件数目
                Exit Sub
            Case "<D>"          '如果是目录
                Set ItmX = ListView1.ListItems.Add(, , GetFD, 1) ‘显示目录
                DirCount = DirCount + 1 ‘文件夹数目计数加一
            Case "<F>"          '如果是文件
                Set ItmX = ListView1.ListItems.Add(, , GetFD, 2) ‘显示文件
                FileCount = FileCount + 1 ‘文件数目计数加一
        End Select
    Loop
Close #3     ‘关闭文件
StatusBar1.Panels(2).Text = DirCount  ‘显示文件夹数目
StatusBar1.Panels(4).Text = FileCount  ‘显示文件数目
End Sub

第六部分:补充和建议
    程序在WinXp+sp1,vb6.0环境编译通过。程序完成后运行时的界面如图:
    
    (一)这个程序的界面和功能还有待完善。读者可以尝试1、建立整个磁盘的文件树,2、获取文件和文件夹的属性以及大小;
    (二)如果这个程序只是针对单机,那么反而效率低,但是如果是远程控制,而且需要传输的次数小的情况下……这就看你的了;
    (三)在写程序过程中一定要养成良好的书写习惯最好是每个变量都要声明,可以选上Vb菜单中的“工具/选项/编辑器”中的“要求变量声明”一项。

使用Dir函数遍历文件和目录相关推荐

  1. php遍历视频文件,php使用glob函数遍历文件和目录详解

    php glob()函数返回匹配指定模式的文件名或目录.因此我们可以使用glob函数来查找文件,也可以实现目录的遍历. 函数说明:array glob ( string $pattern [, int ...

  2. php scandir 目录树,使用php scandir函数遍历文件夹目录和所有文件

    使用php scandir函数遍历文件夹目录和所有文件 $dir = "."; //当前目录 list_file($dir); function list_file($dir){ ...

  3. glob php,php使用glob函数遍历文件和目录详解

    php glob()函数返回匹配指定模式的文件名或目录.因此我们可以使用glob函数来查找文件,也可以实现目录的遍历. 函数说明:array glob ( string $pattern [, int ...

  4. R语言使用fs包的file_copy函数、dir_copy函数、link_copy函数将文件、目录、超链接从一个位置拷贝(copy)到另一个位置

    R语言使用fs包的file_copy函数.dir_copy函数.link_copy函数将文件.目录.超链接从一个位置拷贝(copy)到另一个位置 目录

  5. File类遍历(文件夹)目录功能

    package com.learn.demo01.File;import java.io.File;/*File类遍历(文件夹)目录功能- public String[] list() :返回一个St ...

  6. vba中dir用法_利用Dir函数遍历某文件夹下的所有文件 | VBA实例教程

    今天介绍利用Excel VBA的Dir方法来遍历某文件夹下的所有excel文件.还是直接来看例子,假设在D盘有一个叫工作日志的文件夹,里面放着每日的工作记录,都是excel 2007表格,现在由于工作 ...

  7. Linux C函数之文件及目录函数

    文件及目录函数(37) chdir, chmod, chown, chroot fchdir, fchmod, fchown, ftruncate lchown, truncate, get_curr ...

  8. C#使用WIN32API来高效率的遍历文件和目录(转)

    我们有时需要遍历某个目录下的文件和子目录,可以使用System.IO.DirectoryInfo.GetDirectories或 GetFiles来获得目录下的所有的文件和子目录,当这个目录下的内容比 ...

  9. mysql 创建函数_MySQL文件及目录权限设置分析-爱可生

    1 背景 创建文件及目录时,我们会对相关的权限有一定的要求,默认的可以通过系统的umask来控制.然而,在我们使用MySQL时,无论是开始使用前的初始化,还是MySQL实例启动后,创建的相关文件及目录 ...

最新文章

  1. windows时间同步命令
  2. Shell练习(七)
  3. PHP支付宝接口RSA验证
  4. Linux挂载Linux共享文件夹
  5. Java反射理解与案例
  6. Linux C:管道的实现原理,命名管道
  7. ASP.NET下载网络图片
  8. Laravel笔记记录
  9. thinkphp 在接口开发或者接入三方时解决跨域
  10. Java核心技术- Java内存分配原理
  11. 大数据之-Hadoop3.x_Yarn_生产环境核心参数配置案例---大数据之hadoop3.x工作笔记0150
  12. FastDFS单机搭建以及java客户端Demo
  13. python运维和开发实战-高级篇
  14. 因文件包含病毒或潜在的垃圾软件导致被防火墙拦截的解决方法
  15. 五险一金 | 2020年企业社保缴费为零问题
  16. 坚持---明朝那些事儿
  17. 罗技GHUB打开一直在加载怎么回事?
  18. cygwin和mingw的比较
  19. handlebars.js_Handlebars.js入门指南
  20. 小孔成像总结_初中物理知识点总结+解题技巧+方法总结全汇总

热门文章

  1. AI智能生图技术的未来趋势
  2. 梦幻答题软件测试,欢乐答题官方测试版
  3. 不必上抖音,AI Studio社区项目帮你完成简约风格迁移
  4. 使用代理后,雷鸟连接qq邮箱
  5. Pygame游戏 : PONG
  6. 数据结构与算法--哈夫曼树应用
  7. DNA甲基化比对:Bismark
  8. python柱形图颜色_pyplot/matplotlib条形图,填充颜色取决于值
  9. 理赔实录|有了「安心赔」,理赔不再愁
  10. 解决aab上传GooglePlay超过150M的问题及aab包测试方法