VB6遍历目录(文件夹和文件)

news/2024/4/25 17:49:09/文章来源:https://blog.csdn.net/qq_35844043/article/details/129198516

日期:2023年2月27日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006


文章目录

  • 一、目录、文件夹、文件以及路径的概念
  • 二、聊一聊Dir函数
  • 三、Dir遍历目录的示例
    • (3-1)Dir直接遍历
    • (3-2)第一次封装:Dir递归遍历
    • (3-3)第二次封装:Dir递归遍历


在这里插入图片描述


一、目录、文件夹、文件以及路径的概念

在学习中,工作中,我们经常会说遍历一下当前目录咯。但是一旦被问到这个目录到底是什么的时候,明明我们感觉自己知道是什么,却又说不清楚到底是什么。没关系,接下来我们来了解下,下次就可以说清楚啦……

中文名英文名说明
目录directory一系列文件和文件夹的集合
文件夹folder用来存放文件和文件夹的容器
文件file用来存储信息的单个数据单元(文本、图像、声音等等)
路径path用于定位文件的路径

从上表可以看出,目录和文件夹意思差不多……

实际上目录DOS操作系统时期的称呼,而Windows操作系统时期的称呼为文件夹

严格来说,目录不是文件夹,因为目录映射到存储介质上的物理位置,而文件夹不一定,例如桌面上的文件夹。

现在我们回过头来看“遍历一下当前目录”的含义,实际上就是遍历一系列的文件与文件夹。

这些文件与文件夹和当前路径有着千丝万缕的关系,因此我们会觉得当前目录的感觉又有点侧重于路径,不过它绝不是路径。

二、聊一聊Dir函数

在这里插入图片描述

语法:

Function Dir([PathName], [Attributes As VbFileAttribute = vbNormal]) As String

attributes 参数的设置可为:

常数描述
vbNormal0(缺省) 指定没有属性的文件。
vbReadOnly1指定无属性的只读文件
vbHidden2指定无属性的隐藏文件
VbSystem4指定无属性的系统文件
vbVolume8指定卷标文件;如果指定了其它属性,则忽略vbVolume
vbDirectory16指定无属性文件及其路径和文件夹。

说明:

  • DirVBA.FileSystem 的成员,返回一个 String,用以表示一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配;
  • pathname 可选参数。用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到 pathname,则会返回零长度字符串 ("");
  • attributes 可选参数。常数或数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配 pathname 但不包含属性的文件。

用法:

  • 在第一次调用 Dir 函数时,必须指定 pathname,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname
  • Dir 会返回匹配 pathname 的第一个文件名。若想得到其它匹配 pathname 的文件名,再一次调用 Dir,且不要使用参数。如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ("")。一旦返回值为零长度字符串,并要再次调用 Dir 时,就必须指定 pathname,否则会产生错误。不必访问到所有匹配当前 pathname 的文件名,就可以改变到一个新的 pathname 上。但是,不能以递归方式来调用 Dir 函数。以 vbDirectory 属性来调用 Dir 不能连续地返回子目录。

提示:

  • 由于文件名并不会以特别的次序来返回,所以可以将文件名存储在一个数组中,然后再对这个数组排序;
  • 不能以递归方式来调用 Dir 函数(注意,这是重点,画起来哈

三、Dir遍历目录的示例

在操作之前,我们先看看当前目录结构,这次就在命令行看吧。(想快速了解命令行如何使用,请看我CSDN中的另外一篇博客《Windows中的CMD不需要死记硬背》)

首先,我们得了解怎么用tree来查看当前目录树,执行tree /?

D:\traversingByDir>tree /?
以图形显示驱动器或路径的文件夹结构。       TREE [drive:][path] [/F] [/A]/F   显示每个文件夹中文件的名称。       /A   使用 ASCII 字符,而不使用扩展字符。

然后,我们使用tree /F查看当前目录树结构,如下所示

D:\traversingByDir>tree /F
文件夹 PATH 列表
卷序列号为 277B-1704
D:.
│  clsUtils.bas
│  frmMain.frm
│  MSSCCPRJ.SCC
│  traversingByDir.vbp
│  traversingByDir.vbw
│
└─父│  11.txt│└─子│  22.txt│└─孙33.txt

(3-1)Dir直接遍历

Public Sub UnTraversalDirs(ByVal sPath As String)
On Error Resume Next
'函数说明:遍历当前目录,仅打印出当前目录的文件夹名称和文件名称
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'------数据格式说明------Dim strTemp As StringstrTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)Do Until strTemp = ""Debug.Print strTempstrTemp = Dir()LoopEnd Sub

调用代码:

Call UnTraversalDirs(App.Path)

输出结果:

.
..
clsUtils.bas
frmMain.frm
MSSCCPRJ.SCC
traversingByDir.vbp
traversingByDir.vbw
父

结果说明:

打印内容说明
.特定的目录项,表示当前目录
..特定的目录项,表示上级目录
clsUtils.bas文件名称
frmMain.frm文件名称
MSSCCPRJ.SCC文件名称
traversingByDir.vbp文件名称
traversingByDir.vbw文件名称
文件夹名称

由此,我们有两点结论:

  • Dir只能遍历当前目录,无法遍历子孙目录;
  • ...是特定的目录项,应该排除...的结果;

故,可以修改为:

Public Sub UnTraversalDirs(ByVal sPath As String)
On Error Resume Next
'函数说明:遍历当前目录,仅打印出当前目录的文件夹名称和文件名称
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'------数据格式说明------Dim strTemp As StringstrTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)Do Until strTemp = ""If strTemp <> "." And strTemp <> ".." ThenDebug.Print strTempEnd IfstrTemp = Dir()LoopEnd Sub

(3-2)第一次封装:Dir递归遍历

在开始之前,我们先封装两个函数,一个用来判断是否是文件夹,另一个是路径拼接,如下所示:

Public Function IsDir(ByVal sPath As String) As Boolean
On Error Resume Next
'函数说明:判断是否为文件夹
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'------数据格式说明------If (VBA.GetAttr(sPath) And vbDirectory) <> 0 ThenIsDir = TrueElseIsDir = FalseEnd If
End FunctionPublic Function PathJoin(ByVal sPath As String, ByVal sName As String) As String
On Error Resume Next
'函数说明:路径合并
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'sName:拼接名称
'------数据格式说明------If sName <> "" ThenPathJoin = sPath & "\" & sNameElsePathJoin = sPathEnd If
End Function

我们将(3-1)中所说的UnTraversalDirs(ByVal sPath As String)遍历当前目录,封装成ListDir(ByVal sPath As String, ByRef clnDir As Collection),用来执行递归调用,这样就可以比较完美的解决Dir无法递归的问题。这个函数也有点抄作业的感觉,抄Python的内置函数os.listdir(path)。如感兴趣,可以看我的另一篇博客《python3遍历目录的三种方法浅谈》

ListDir:返回查询目录的遍历结果

Public Sub ListDir(ByVal sPath As String, ByRef clnDir As Collection)
On Error Resume Next
'函数说明:返回查询目录的遍历结果
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'clnDir:查询返回结果,以集合返回
'------数据格式说明------Dim strTemp As String, cPath As StringstrTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)Do Until strTemp = ""cPath = PathJoin(sPath, strTemp)If IsDir(cPath) Then'floderIf strTemp = "." Or strTemp = ".." Then'pass'目录在计算机的文件系统中也是文件,.和 .. 在目录文件中标识特定的目录项'linux下当前目录和上级目录ElseclnDir.Add strTempEnd IfElse'fileclnDir.Add strTempEnd IfstrTemp = Dir()Loop
End Sub

调用代码:

Dim clnDir As Collection, i As Long
Set clnDir = New Collection
Call ListDir(App.Path, clnDir)
For i = 1 To clnDir.CountDebug.Print clnDir(i)
Next i

输出结果:

clsUtils.bas
frmMain.frm
MSSCCPRJ.SCC
traversingByDir.vbp
traversingByDir.vbw
父

接下来我们来递归调用ListDir,打印出查询的所有目录结果:

  • 封装
Public Sub TraversalDirs(sPath)
On Error Resume Next
'函数说明:递归遍历当前目录,包括子孙目录
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'------数据格式说明------Dim clnDir As New Collection, i As LongDim cPath As StringCall ListDir(sPath, clnDir)For i = 1 To clnDir.CountDebug.Print clnDir(i)cPath = PathJoin(sPath, clnDir(i))If IsDir(cPath) ThenCall TraversalDirs(cPath)End IfNext i
End Sub
  • 调用代码
Call TraversalDirs(App.Path)
  • 输出结果
clsUtils.bas
frmMain.frm
MSSCCPRJ.SCC
traversingByDir.vbp
traversingByDir.vbw
父
11.txt
子
22.txt
孙
33.txt

(3-3)第二次封装:Dir递归遍历

ListAllDir:获取路径下的所有目录(文件夹目录+文件目录),即遍历路径下所有文件夹和文件,返回值为目录集合。

Public Function ListAllDir(ByVal sPath As String, ByRef clnDir As Collection) As Collection
On Error Resume Next
'函数说明:获取路径下的所有目录(文件夹目录+文件目录),即遍历路径下所有文件夹和文件,返回值为目录集合。
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'------数据格式说明------Dim clnFdDir As New Collection, i As LongDim strTemp As String, cPath As StringstrTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)Do Until strTemp = ""cPath = PathJoin(sPath, strTemp)If IsDir(cPath) Then'folderIf strTemp = "." Or strTemp = ".." Then'pass'目录在计算机的文件系统中也是文件,.和 .. 在目录文件中标识特定的目录项'linux下当前目录和上级目录ElseclnFdDir.Add cPathclnDir.Add cPathEnd IfElse'file'Debug.Print strTempclnDir.Add cPathEnd IfstrTemp = Dir()LoopIf clnFdDir.Count > 0 ThenFor i = 1 To clnFdDir.Count'Debug.Print i, clnFdDir(i)Call ListAllDir(clnFdDir(i), clnDir)Next iEnd IfEnd Function
  • 调用代码
    Dim clnAllDir As Collection, i As LongSet clnAllDir = New CollectionCall ListAllDir(App.Path, clnAllDir)For i = 1 To clnAllDir.CountDebug.Print clnAllDir(i)Next i
  • 输出结果
D:\traversingByDir\clsUtils.bas
D:\traversingByDir\frmMain.frm
D:\traversingByDir\MSSCCPRJ.SCC
D:\traversingByDir\traversingByDir.vbp
D:\traversingByDir\traversingByDir.vbw
D:\traversingByDir\父
D:\traversingByDir\父\11.txt
D:\traversingByDir\父\子
D:\traversingByDir\父\子\22.txt
D:\traversingByDir\父\子\孙
D:\traversingByDir\父\子\孙\33.txt

我的微信公众号【会飞的小猴子】,等你来关注哦 ^ - ^


1、《What is the difference between a directory and a folder?》
2、《极客教程-Python os.scandir()方法》
3、《python3遍历目录的三种方法浅谈》


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/129198516

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_75093.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产业链金融对接央行征信过程

2018年10月底&#xff0c;央行二代征信系统上线试运行。2018年10月至2019年4月&#xff0c;央行二代征信系统 进行试运行&#xff0c;全国16家试点机构参与全业务试运行&#xff0c;14家机构进行查询试点。2019年6月&#xff0c;央行二 代征信系统正式上线。2019年6月至2020年1…

计算机信息系统安全服务等级证

计算机信息系统安全服务等级评定是规范行业服务、提升企业诚信度、保证工程质量、市场准入控制的重要保证&#xff0c;是安全服务机构从事信息网络安全服务能力的等级证明&#xff0c;为我省信息化建设使用单位在选择网络安全服务机构时提供参考依据。 等级划分 安全服务机构等…

Java中常用的七种队列你了解多少?

文章目录Java中常用的七种队列你了解多少?ArrayBlockingQueue队列如何使用&#xff1f;添加元素到队列获取队列中的元素遍历队列LinkedBlockingQueue队列如何使用&#xff1f;1. 创建SynchronousQueue对象2. 添加元素到队列3. 获取队列中的元素4. 遍历队列SynchronousQueue队列…

我要测网2022优秀检测机构评选活动举办,径硕科技分享数字营销趋势

2023年2月17号&#xff0c;由我要测网主办的「数字营销韧性增长&#xff5c;2023TIC营销人开年报告」圆满举办。来自南京市产品质量监督检验院、中国检科院测试评价中心、径硕科技JINGdigital等企业的3位“重量级”嘉宾进行了精彩纷呈的分享&#xff0c;为在低谷中前行的检测机…

我嘞个神——原来创建应用根本不需要会编码(看我10分钟应用上线)

目录 一、前言 二、官网功能查询与环境初始化 YonBuilder应用开发 三、测试过程 3.1、创建应用 3.2、数据建模 3.3、页面建模 3.4、页面发布 四、时间累计 五、效率评价 六、总结 一、前言 这里我用到了用友的平台&#xff0c;很多学生们刚毕业都在从事运维和实施的…

Java基础:常见API(Math,System,Runtime,Object,BigInteger,BigDecima)

1.常见API 1.1 Math类 向上取整是向着数轴右边走的意思, 负数也是. 也可以叫进一法, 不论正数负数都会往右走一. 向下取整是向着数轴左边走. 也可以叫去尾法, 不论正负数都会将小数点后的数字去掉. 1.1.2 练习 // 判断有多少水仙花数int count 0;for (int i 100; i < 1…

如何在没有任何额外包的情况下使用 NodeJS 下载文件

如何在没有任何额外包的情况下使用 NodeJS 下载文件 您可以下载文件&#xff08;图像、文本或任何类型的文件&#xff09;并使用 NodeJS 内置 https和 fs模块将其保存到您的文件系统。 该 https模块允许您使用 NodeJS 创建 HTTPS 请求&#xff0c;同时该 fs模块授予您访问文件…

【论文精读11】MVSNet系列(2018-2022)总结

MVSNet系列总结1.MVSNet ECCV20182.RMVSNet CVPR20193.P-MVSNet ICCV20194.MVSCRF ICCV20195.PointMVSNet ICCV20192019年的这四篇文章各有特点&#xff0c;其中RMVSNet、PointMVSNet更是打开了可以继续沿着往下做的思路&#xff1a;6.cascade MVSNet CVPR20207.UCSNet CVPR202…

Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例实践应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

Python基础—while循环

(1)while循环&#xff1a; 语法格式&#xff1a; while 条件&#xff1a;   执行语句1……   执行语句2…… 适用条件&#xff1a;无限循环 死循环 while True:print(条件是真的&#xff01;)代码实例&#xff1a; i 0 # 创建一个计数的变量 while i < 5: # Truepr…

一个容易被忽视的标签 —— iframe

前言 甲问&#xff1a;说说你知道的HTML标签。 乙于是说了一大堆标签&#xff0c;比如div&#xff0c;span等等。 甲说&#xff1a;那你知道 iframe 标签吗&#xff1f; 乙这时候迟疑了片刻&#xff0c;缓缓说出&#xff1a;知道它&#xff0c;但是不太了解这个标签。 HTM…

Linux文件属性--软连接和硬链接

文章目录软链接硬链接软链接和硬链接的区别软链接 软链接&#xff08;Soft Link&#xff09;又叫符号链接&#xff08;Symbolic Link &#xff09;&#xff0c;是linux特殊文件的一种&#xff0c;文件类型为l,它的数据是它所链接的文件或目录的路径。软链接可以跨磁盘和 分区…

动手学深度学习(第二版)学习笔记 第三章

第三章 线性神经网络 代码&#xff1a;d2l-zh/pytorch/chapter_linear-networks 3.1 线性回归 3.1. 线性回归 — 动手学深度学习 2.0.0 documentation 解析解 线性回归的解可以用一个公式简单地表达出来&#xff0c;这类解叫作解析解&#xff08;analytical solution&…

git在工作中的正常使用

开发A和B功能后进行发版。。 一、拉取代码 git clone http://ntc.ntsvars.com:8090/lvweijie/test.git二、开发功能A任务 创建A任务本地分支 #创建A分支&#xff0c;并切换A分支 git checkout -b A三、开发A任务 四、提交A功能文件到本地分支 git add .五、添加提交A功能备…

AcWing3485. 最大异或和

先看题目&#xff1a; 说实话&#xff0c;我看到这道题就想用滑动窗口&#xff0c;但是滑了一下发现不太对啊&#xff0c;如果我用滑动窗口的话&#xff0c;那么最后肯定是一个固定长度为m的窗口在持续计算&#xff0c;区间长度小于m的区间的异或和肯定会被遗漏。然后我就想怎么…

FSP:Flow of Solution Procedure (CVPR 2017) 原理与代码解析

paper&#xff1a;A Gift From Knowledge Distillation: Fast Optimization, Network Minimization and Transfer Learningcode&#xff1a;https://github.com/HobbitLong/RepDistiller/blob/master/distiller_zoo/FSP.py背景深度神经网络DNN逐层生成特征。更高层的特征更接近…

决策树在sklearn中的实现

目录 一.模块sklearn.tree 二.建模基本流程 三.DecisionTreeClassifier重要参数 1.criterion 2.random_state & splitter 3.剪枝参数max_depth 4.剪枝参数min_samples_leaf & min_samples_split 5.max_features & min_impurity_decrease 6.class_weight …

Python IDE:对于 Python 初学者来说,最好的 IDE 是什么?

Python 是科技界最简单、使用最广泛的编程语言之一。它是一种高级通用编程语言&#xff0c;强调代码可读性并使用面向对象的方法。Python可以用来完成很多任务&#xff0c;包括网站开发、软件开发、 自动化 和数据分析 专业开发人员使用Python开发各种流行的软件程序&#xff0…

深入理解Spring MVC上

Spring MVC 是一种基于 Spring 框架的 Web 框架&#xff0c;它提供了一种基于 Model-View-Controller&#xff08;MVC&#xff09;的设计模式&#xff0c;用于构建 Web 应用程序。在 Spring MVC 中&#xff0c;Controller 接受并处理 HTTP 请求&#xff0c;并将其转发给适当的 …

多表left join 慢sql问题

作为个人记录&#xff0c;后续再填坑a对p是1对多 ,p对llup 1对多SELECTa.id,p.id,t1.id FROMliv_series_product aINNER JOIN liv_product p ON p.id a.product_idLEFT JOIN ( SELECT llup.id, llup.product_id, llup.room_id FROM liv_live_user_product llup WHERE llup.ro…