ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 香川群子

[分享] 跟我学 【喜迎2015立春】遍历文件夹(含子文件夹)方法 ABC

    [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-2-6 15:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:文件操作和FSO
香川群子 发表于 2015-2-6 14:10
你这个帖子中,

arrFolderPath = Split(strFolderName, "\")

看香川大师写的代码就是至高的享受! 只要是香川大师的代码,我都会仔细认真看,好好品味,就像品茶一样的享受!

TA的精华主题

TA的得分主题

发表于 2015-2-6 16:19 | 显示全部楼层
很好的帖子,给香川老师赞一个!

TA的精华主题

TA的得分主题

发表于 2015-2-6 18:13 | 显示全部楼层
wshcw 发表于 2015-2-4 15:43
已收藏学习,并建议本版版主加精华或加技术.

蓝桥版主在29楼的技术分到底是加给谁的呢?

TA的精华主题

TA的得分主题

发表于 2015-2-7 06:35 | 显示全部楼层
香川群子 发表于 2015-2-6 14:41
你提供的WMI脚本方法,
说到底和我6楼的FSO递归实现结果并无差异……反而代码复杂难以记住。那么你认为好 ...

我们倾向于使用 WMI。使用它编写的脚本可能比使用 FileSystemObject 或 Shell 对象编写的类似脚本复杂一些,但 WMI 脚本的优点是,在本地计算机上检索此类信息与从远程计算机中检索同样方便。而 FileSystemObject 或 Shell 对象都做不到这一点。我们看重的是 WMI 的灵活性。

TA的精华主题

TA的得分主题

发表于 2015-2-7 06:38 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
如何获得某个文件夹及其子文件夹中的所有文件列表?
问:
嗨,Scripting Guy!如何使用脚本显示某个文件夹中的所有文件?然后,如何修改那个脚本以便显示另一个文件夹中任何子文件夹下的所有文件?
-- CS
答:
嗨,CS。昨天我们曾向大家介绍了一个可以将文件夹下所有文件的属性由只读更改为可读写的脚本。我们还担保过,会在今天的专栏中说明如何获取文件夹中所有文件的列表。您的问题恰好和我们的话非常吻合。
好吧,让我们从简单点的先来:可列出文件夹下所有文件的脚本。以下脚本可报告文件夹 C:\Scripts 下所有文件的文件名:
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "C:\Scripts"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next
您也看到了,这并不复杂。我们首先创建了一个 FileSystemObject 实例,然后使用 GetFolder 方法绑定到文件夹 C:\Scripts。非常简单。如果我们需要绑定到……比如说就是 Windows 文件夹吧,那么我们需要做的就是相应地更改路径,也就是给 objStartFolder 分配一个不同的值:
objStartFolder = "C:\Windows"
连接到文件夹后,我们使用以下命令创建了一个对 Files 属性的引用:
Set colFiles = objFolder.Files
这会向我们返回一个由该文件夹下所有文件组成的集合。(但是--这对您的第二个问题具有重要的提示意义--这个集合中不包含 C:\Scripts 的任何子文件夹下的文件。)此时,剩下的工作就简单了:我们可以使用一个 For Each 循环对集合中的所有文件执行循环,然后--我们可以选择--对每个文件执行某种操作。由于您问的是如何获取文件夹下所有文件的列表,因此我们只需回显文件的名称即可。但是我们还可以执行更多任务;例如我们可以报告 DateCreated 属性或 Size 属性。有关 FileSystemObject 以及如何使用它的更多信息,请访问"Microsoft Windows 2000 脚本编写指南"中的 "脚本运行时入门"。
换句话说,获取文件夹下所有文件的列表比较容易。获取某个文件夹下包括这个文件夹下所有子文件夹中的全部文件列表会稍微麻烦一点。为了实现这个目的,您需要使用递归脚本。我们不打算在这里介绍递归;有关详细信息,请访问"Microsoft Windows 2000 脚本编写指南"中的相关部分. (我们今天的确有点象是在推销这本书,是吧?)一般说来,递归函数就是可以根据需要无限次调用自身的函数。这可能不太容易理解,不过您可以按照以下思路想一想。上述脚本只是列出了文件夹下所有文件,然后就停止了。对于它来说,这个文件夹下是否还有子文件夹无关紧要,它并不关心这个。
递归函数就不同了,相反,它的确关心这个文件夹下的子文件夹:这个函数会一直运行,直到完成您要求它完成的所有工作,甚至更多。递归函数会列出文件夹下的所有文件,然后检查该文件夹是否还有子文件夹。假设它发现了子文件夹 A 和 B。那么在上述情况下,它会调用自身,然后列出子文件夹 A 中的所有文件。但是,假如子文件夹 A 下还有二级子文件夹 C 呢?没有问题:这个函数会再调用自身,并列出二级子文件夹 C 中的所有文件。这个过程会一直进行,直到列出 A 中所有子文件夹下的所有文件为止。此时,这个函数会回过头来处理子文件夹 B。而且,它会不断调用自身,直到列出 B 中每个子文件夹、二级子文件夹、三级子文件夹--好吧,所有子文件夹下的所有文件为止。
听起来比较复杂,而情况也确实是这样的。幸好,VBScript 隐去了大多数这种复杂性。嗨,我们会和您开这种玩笑吗?请看,以下脚本使用了递归函数 ShowSubFolders 来列出文件夹 C:\Scripts 下以及该文件夹下所有子文件夹的所有文件:
Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "C:\Scripts"
Set objFolder = objFSO.GetFolder(objStartFolder)
Wscript.Echo objFolder.Path
Set colFiles = objFolder.Files
For Each objFile in colFiles
    Wscript.Echo objFile.Name
Next
Wscript.Echo
ShowSubfolders objFSO.GetFolder(objStartFolder)
Sub ShowSubFolders(Folder)
    For Each Subfolder in Folder.SubFolders
        Wscript.Echo Subfolder.Path
        Set objFolder = objFSO.GetFolder(Subfolder.Path)
        Set colFiles = objFolder.Files
        For Each objFile in colFiles
            Wscript.Echo objFile.Name
        Next
        Wscript.Echo
        ShowSubFolders Subfolder
    Next
End Sub
'---------------------------------------------------------------------------
如您所见,这个脚本的第一部分其实和我们刚才看到的脚本一样(除了有一点不同:这个脚本回显文件夹路径,这样我们才知道我们看到的是哪个文件夹)。在显示 C:\Scripts 中的所有文件之后,脚本接着调用递归函数 ShowSubFolders。然后,这个函数会详细检查所有子文件夹,并报告所发现的任何文件。所有这些"递归操作"都是自动发生的,您什么都不用做,只要坐下来看着就可以了。
如果您还没有完全明白这里发生了什么事的话,也不用担心,要完全掌握递归函数的工作原理还是需要一点时间的。同时,您可以把上述脚本复制带走,并在需要对文件夹及其子文件夹下的所有文件执行操作时使用这个脚本。

TA的精华主题

TA的得分主题

发表于 2015-2-7 07:08 | 显示全部楼层
   
获取文件夹

Const WINDOW_HANDLE = 0
    Const NO_OPTIONS = 0
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.BrowseForFolder _
            (WINDOW_HANDLE, "请选择一个文件夹:", NO_OPTIONS)
    Set objFolderItem = objFolder.Self
    ?? objFolderItem.Path

TA的精华主题

TA的得分主题

发表于 2015-2-7 11:51 | 显示全部楼层
香川群子 发表于 2015-2-4 12:52
最后,作为本帖的特色,介绍使用VBA语句直接调用Dos中Dir命令来搜寻文件名的方法:呵呵,Dos命令不仅简洁, ...

香川大师:有一个小错误,纠正下
     Application.StatusBar = Format(Timer - tms, "0.00s") & " Find " & UBound(ar)& " Files " & s
应该是如下:
      Application.StatusBar = Format(Timer - tms, "0.00s") & " Find " & UBound(ar) + 1 & " Files " & s

点评

但事实上我并没有错啊…………哈哈哈。  发表于 2015-2-7 14:53

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-2-7 14:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 引子玄 于 2015-2-7 14:16 编辑

FSO要用到,要的。比如个人经常套用的代码(用于网抓下载),里面就有FSO,尽管不是很懂,慢慢熟化。

Private Sub makelog(inputed_string, log_path, filetype)
   Dim objFSO, logfile, logtext, log_folder

   Set objFSO = CreateObject("Scripting.FileSystemObject")
   On Error Resume Next
   Set log_folder = objFSO.CreateFolder(log_path)

   If objFSO.FileExists(log_path & "\log." & filetype) = 0 Then
       Set logfile = objFSO.CreateTextFile(log_path & "\log." & filetype, True, -1)
   End If
   Set log_folder = Nothing
   Set logfile = Nothing

   Set logtext = objFSO.OpenTextFile(log_path & "\log." & filetype, 2, True, -1)
   logtext.Write inputed_string
   logtext.Close

   Set objFSO = Nothing
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-2-7 14:55 | 显示全部楼层
本帖最后由 香川群子 于 2015-2-7 15:03 编辑
hnyylx 发表于 2015-2-7 11:51
香川大师:有一个小错误,纠正下
     Application.StatusBar = Format(Timer - tms, "0.00s") & " Find ...

你仔细看一下实际结果,事实上结果如下:
如果没有产生筛选需求,则UBound(ar)是正确的,不需要+1…………因为Dos提取结果中,最后有1个多余的空格……所以不需要+1修正文件数统计结果的。……呵呵,


但是,如果产生了筛选需求,则最后的空格会被筛去,于是实际结果需要更正为 UBound(ar)+1


…………


所以,正确的修改方法应该是:
Application.StatusBar = Format(Timer - tms, "0.00s") & " Find " & UBound(ar) + IIf(myFile = "", 0, 1) & " Files " & s

TA的精华主题

TA的得分主题

发表于 2015-2-7 18:43 | 显示全部楼层
香川群子 发表于 2015-2-6 13:54
你贴出来的那部分代码逻辑混乱,参数引用错误……无论如何,也是不能正常使用的。

香川大师:以下几行代码能否帮助解释下?谢谢!我将您这个主题的所有代码全部看完消化了,受益很多,期待香川大师下次再推精品!

  ("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
        & "Where AssocClass = Win32_Subdirectory " _
        & "ResultRole = PartComponent")
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-15 02:12 , Processed in 0.055406 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表