ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] 利用FileSystem的方法递归遍历指定文件夹的所有层级文件(另有Value的另类用法)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-10-25 19:48 | 显示全部楼层 |阅读模式
本帖最后由 spaghetti8 于 2024-10-25 19:51 编辑

遍历指定文件夹的所有层级文件是一个常见的需求,以前是采用Dir()的方法,现在18608版本更新后,可以通过利用FileSystem的方法递归来实现,另浅谈一下Value的另类用法:

一、本例中,利用到了FileSystem的三个方法:
    1、FileSystem.readdirSync(path)
    2、FileSystem.stat(path)
    3、FileSystem.stat((path)).isDirectory()
  第一个方法是遍历path里的文件及文件夹,但是,它只遍历一层,不会再向下遍历
  第二个方法是返回path的各种属性,例如创建时间,修改时间,是否是文件,文件大小等
  第三个方法是判断是否是文件夹,是就返回true,否则返回false

  二、Value的另类用法:
  一般情况下,大家都喜欢用Value2进行取值和赋值,其实还有另一种是Value;  它们的区别包括但不限于:
          1、Value2是属性,Value是方法;方法的调用必须加(),所以Value后面必须跟括号,如果括号里面不传参,则代表取值,  如果传参则代表赋值。根据本人测试,当第一个参数设置为null或者10时,可以对第二参数的数据进行写入。
           2、Value在不传参取值时,如果单元格的值是日期,则与Value2的取值不同,例如,单元格显示2024/10/25,Value2的取值为45590,typeof的结果为"number",Value()的取值为1729814400000,typeof的结果为"object",可以对这个结果进行getTime的操作.
QQ截图20241025194554.png

评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-10-25 21:29 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
曾经遍历看到过 stat,没时间摸索怎么用,学习了。

TA的精华主题

TA的得分主题

发表于 2024-10-25 21:31 | 显示全部楼层
mkdtempSync是指定临时文件夹的么?不知道怎么用的

TA的精华主题

TA的得分主题

发表于 2024-11-9 12:10 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-11-9 12:37 | 显示全部楼层
楼主有空把代码上传一下,最主要是懒得一个一个打了,我想好多人也都是这样子,虽然拿来主义不好

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-11-9 20:17 | 显示全部楼层
lizhipei78 发表于 2024-11-9 12:37
楼主有空把代码上传一下,最主要是懒得一个一个打了,我想好多人也都是这样子,虽然拿来主义不好

附件当时忘记传了,现在补一个。
  1. function test241025(){//递归遍历指定文件夹的所有层级文件
  2.         const fs = Application.FileDialog(msoFileDialogFolderPicker);        //定义文件夹选择器
  3.         fs.Show();                                                                                                                //显示文件夹选择器
  4.         const res = [[fs.SelectedItems(1)]];                                                        //取得选中的第一个文件夹,并二维化       
  5.         (function listDir(path){                                                                                //递归函数
  6.                 FileSystem.readdirSync(path).forEach(file => {
  7.                         res.push([`${path}/${file}`])
  8.                         FileSystem.stat(`${path}/${file}`).isDirectory() && listDir(res.at(-1)[0])
  9.                 })       
  10.         }(res[0][0]));                                                                                                        //从第一个文件夹开始运行
  11.         Range('A:A').Clear();                                                                                        //清楚单元格区域
  12.         Range('A1').Resize(res.length, 1).Value(10,res);                                //写入数据
  13. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-11-28 20:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主真不错,请问一下Range('A1').Resize(res.length, 1).Value(10,res)这代码怎么会是写入数据呢?看不懂,谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-11-29 08:44 | 显示全部楼层
cjitoliaw 发表于 2024-11-28 20:35
楼主真不错,请问一下Range('A1').Resize(res.length, 1).Value(10,res)这代码怎么会是写入数据呢?看不懂, ...

程序就是这么规定的,不传参就是取值,传入指定参数就是赋值.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 15:43 , Processed in 0.037871 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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