日期:2023年2月27日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助
,帮忙点个赞
,也可以关注我
,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006
在学习中,工作中,我们经常会说遍历一下当前目录咯。但是一旦被问到这个目录到底是什么的时候,明明我们感觉自己知道是什么,却又说不清楚到底是什么。没关系,接下来我们来了解下,下次就可以说清楚啦……
中文名 | 英文名 | 说明 |
---|---|---|
目录 | directory |
一系列文件和文件夹的集合 |
文件夹 | folder |
用来存放文件和文件夹的容器 |
文件 | file |
用来存储信息的单个数据单元(文本、图像、声音等等) |
路径 | path |
用于定位文件的路径 |
从上表可以看出,目录和文件夹意思差不多……
实际上目录
是DOS操作系统时期的称呼,而Windows操作系统时期的称呼为文件夹
。
严格来说,目录不是文件夹,因为目录映射到存储介质上的物理位置,而文件夹不一定,例如桌面上的文件夹。
现在我们回过头来看“遍历一下当前目录”的含义,实际上就是遍历一系列的文件与文件夹。
这些文件与文件夹和当前路径有着千丝万缕的关系,因此我们会觉得当前目录的感觉又有点侧重于路径,不过它绝不是路径。
语法:
Function Dir([PathName], [Attributes As VbFileAttribute = vbNormal]) As String
attributes
参数的设置可为:
常数 | 值 | 描述 |
---|---|---|
vbNormal |
0 | (缺省) 指定没有属性的文件。 |
vbReadOnly |
1 | 指定无属性的只读文件 |
vbHidden |
2 | 指定无属性的隐藏文件 |
VbSystem |
4 | 指定无属性的系统文件 |
vbVolume |
8 | 指定卷标文件;如果指定了其它属性,则忽略vbVolume |
vbDirectory |
16 | 指定无属性文件及其路径和文件夹。 |
说明:
Dir
是 VBA.FileSystem
的成员,返回一个 String
,用以表示一个文件名、目录名或文件夹名称,它必须与指定的模式或文件属性、或磁盘卷标相匹配;pathname
可选参数。用来指定文件名的字符串表达式,可能包含目录或文件夹、以及驱动器。如果没有找到 pathname,则会返回零长度字符串 (""
);attributes
可选参数。常数或数值表达式,其总和用来指定文件属性。如果省略,则会返回匹配 pathname 但不包含属性的文件。用法:
Dir
函数时,必须指定 pathname
,否则会产生错误。如果也指定了文件属性,那么就必须包括 pathname
;Dir
会返回匹配 pathname
的第一个文件名。若想得到其它匹配 pathname
的文件名,再一次调用 Dir
,且不要使用参数。如果已没有合乎条件的文件,则 Dir
会返回一个零长度字符串 (""
)。一旦返回值为零长度字符串,并要再次调用 Dir
时,就必须指定 pathname
,否则会产生错误。不必访问到所有匹配当前 pathname
的文件名,就可以改变到一个新的 pathname
上。但是,不能以递归方式来调用 Dir
函数。以 vbDirectory
属性来调用 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
Public Sub UnTraversalDirs(ByVal sPath As String)
On Error Resume Next
'函数说明:遍历当前目录,仅打印出当前目录的文件夹名称和文件名称
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'------数据格式说明------
Dim strTemp As String
strTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)
Do Until strTemp = ""
Debug.Print strTemp
strTemp = Dir()
Loop
End 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 |
文件名称 |
父 |
文件夹名称 |
由此,我们有两点结论:
.
和..
是特定的目录项,应该排除.
和..
的结果;故,可以修改为:
Public Sub UnTraversalDirs(ByVal sPath As String)
On Error Resume Next
'函数说明:遍历当前目录,仅打印出当前目录的文件夹名称和文件名称
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'------数据格式说明------
Dim strTemp As String
strTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)
Do Until strTemp = ""
If strTemp <> "." And strTemp <> ".." Then
Debug.Print strTemp
End If
strTemp = Dir()
Loop
End Sub
在开始之前,我们先封装两个函数,一个用来判断是否是文件夹,另一个是路径拼接,如下所示:
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 Then
IsDir = True
Else
IsDir = False
End If
End Function
Public Function PathJoin(ByVal sPath As String, ByVal sName As String) As String
On Error Resume Next
'函数说明:路径合并
'创建作者:Commas
'创建时间:2022-02-24
'修改时间:
'------数据格式说明------
'sPath:查询路径
'sName:拼接名称
'------数据格式说明------
If sName <> "" Then
PathJoin = sPath & "\" & sName
Else
PathJoin = sPath
End 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 String
strTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)
Do Until strTemp = ""
cPath = PathJoin(sPath, strTemp)
If IsDir(cPath) Then
'floder
If strTemp = "." Or strTemp = ".." Then
'pass
'目录在计算机的文件系统中也是文件,.和 .. 在目录文件中标识特定的目录项
'linux下当前目录和上级目录
Else
clnDir.Add strTemp
End If
Else
'file
clnDir.Add strTemp
End If
strTemp = 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.Count
Debug.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 Long
Dim cPath As String
Call ListDir(sPath, clnDir)
For i = 1 To clnDir.Count
Debug.Print clnDir(i)
cPath = PathJoin(sPath, clnDir(i))
If IsDir(cPath) Then
Call TraversalDirs(cPath)
End If
Next i
End Sub
Call TraversalDirs(App.Path)
clsUtils.bas
frmMain.frm
MSSCCPRJ.SCC
traversingByDir.vbp
traversingByDir.vbw
父
11.txt
子
22.txt
孙
33.txt
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 Long
Dim strTemp As String, cPath As String
strTemp = Dir(sPath & "\*.*", vbDirectory + vbNormal + vbArchive + vbHidden + vbReadOnly + vbSystem)
Do Until strTemp = ""
cPath = PathJoin(sPath, strTemp)
If IsDir(cPath) Then
'folder
If strTemp = "." Or strTemp = ".." Then
'pass
'目录在计算机的文件系统中也是文件,.和 .. 在目录文件中标识特定的目录项
'linux下当前目录和上级目录
Else
clnFdDir.Add cPath
clnDir.Add cPath
End If
Else
'file
'Debug.Print strTemp
clnDir.Add cPath
End If
strTemp = Dir()
Loop
If clnFdDir.Count > 0 Then
For i = 1 To clnFdDir.Count
'Debug.Print i, clnFdDir(i)
Call ListAllDir(clnFdDir(i), clnDir)
Next i
End If
End Function
Dim clnAllDir As Collection, i As Long
Set clnAllDir = New Collection
Call ListAllDir(App.Path, clnAllDir)
For i = 1 To clnAllDir.Count
Debug.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