//开始遍历的文件目录
function getfolderPath(){
return String.raw `H:\视频\动漫\航海王(海贼王)`;
}
//在B列写入遍历到的文件
function writeArr(fileArr){
Columns(2).Value2 = null; //清空B列
fileArr = fileArr.map(path => [path]); //套一层数组
Range("B1").Resize(fileArr.length,fileArr[0].length).Value2 = fileArr; //写入B列
}
//取得文件(不含文件夹)
function demoA(){
var fileArr = getFiles(getfolderPath()); //不使用第2参数,不会返回遍历到的文件目录
writeArr(fileArr);
}
//取得文件与文件目录
function demoB(){
var fileArr = getFiles(getfolderPath(), true); //起始文件目录
fileArr = layer(fileArr); //层次感
writeArr(fileArr);
}
//取得文件目录(文件夹)
function demoC(){
var fileArr = getFiles(getfolderPath(), true); //使用第二参数,返回遍历到的文件夹
fileArr = fileArr.filter(path => GetAttr(path) == jsDirectory); //筛选文件目录
fileArr = layer(fileArr); //层次感
writeArr(fileArr);
}
//搞个层次感,去掉最后一个斜杠之前的路径,只保留文件名或者文件目录
function layer(fileArr){
var pattern = /\\|\//g; //正则对象
var startLen = fileArr[0].match(pattern).length + 1; //斜杠数量加1
return fileArr.map(path => {
let texts = path.split(pattern)
return " ".repeat(texts.length - startLen) + texts.pop();
});
}
/*递归遍历文件与文件夹
*@param folderPath 开始遍历的文件目录(作为根目录),会作为返回数组的第0个元素,如果文件目录不存在,则会抛出一个错误
*@param isReturnFolders 布尔值,true表示返回遍历到的文件目录,默认为false
*@return 返回一个数组,元素为遍历到的所有文件的绝对路径
*/
function getFiles(folderPath, isReturnFolders = false) {
function getNext(path) {
let fileName = Dir(path + "\\*", jsDirectory);//初始化Dir环境为查找全部文件(文件夹与文件);jsDirectory = 16
let recordArr = []; //记录当前文件夹遍历到的全部文件
while(fileName != ""){
if(fileName != "." && fileName != ".."){ //排除"."与".."
recordArr.push(path + "\\" + fileName); //记录文件绝对路径
}
fileName = Dir(); //下一个文件
}
while(recordArr.length != 0){ //递归停止条件
let shiftPath = recordArr.shift(); //弹出首个路径(队列顺序)
fileArr.push(shiftPath);
if(GetAttr(shiftPath) == jsDirectory){ //如果是一个文件目录,则进行递归
!isReturnFolders && fileArr.pop(); //是否不保存遍历到的文件目录
getNext(shiftPath);
}
}
}
if(Dir(folderPath, jsDirectory) == ""){
throw new Error("【" + folderPath + "】文件夹路径不存在")
}
folderPath = folderPath.replace(/(\\|\/)$/, ""); //去除最后一个正斜杠或者反斜杠(如果存在的话)
var fileArr = [folderPath]; //存放遍历到的所有文件,首先保存遍历的根目录
getNext(folderPath); //开始遍历
return fileArr;
}