微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Node js 中深度创建目录 说明

如何解决在 Node js 中深度创建目录 说明

我正在努力实现这一目标

编写一个接受单个参数(深度)的脚本(以任何语言)来创建预期的文件夹和文件

  1. 在深度 0 处,创建一个名为 0 的文件夹,并在其中创建一个以相对路径为内容文件
  2. 在深度 1:除了深度 0 应该做的事情之外,创建两个名为 0 和 1 的子文件夹,并分别创建一个文件来保存其路径。
  3. 深度 2:除了深度 1 应该做的事情,在深度 1 创建的文件夹中创建子文件夹,并将它们命名为 0、1 和 2,并按照相同的规则创建文件
  4. 在深度 N:相同的规则。

我试过这种方法

const fs = require('fs');

function makedir(depth) {
    let newpath = [];
    for (let i = 0; i <= depth; i++) {
        newpath.push(i);
        let joined = newpath.join('/');
        if (!fs.existsSync(joined)) {
            fs.mkdirsync(joined);
            fs.writeFileSync('path.txt',joined);
        }
    }
}
makedir(2);

但它未能完成这项工作。
它只在根目录下创建了这样的文件夹 0/1/2 和一个文件

解决方法

在这个解决方案上工作了几个小时。它非常未经优化,但它可以从 mkdir(0) 到 mkdir(6)。我确信我的代码可以改进!

该函数采用最低深度,从该数字生成所有可能的唯一排列,删除任何不适合树状层次结构的数字,然后根据该数字生成文件夹和文件。然后对越来越深的深度重复该过程。

如果您能找到一种从头开始生成路径列表的方法,而无需计算所有排列,那将大大提高性能。

const fs = require('fs');

function mkdir(depth) {
    for (h=0; h<=depth; h++) {
        let x = ""
        for (i=0; i <= h; i++) {
            x += i.toString()
        }
        x = x.split('')
        x = allPossibleCombinations(x,(h + 1),'');
        for (i=(x.length - 1); i >= 0; i--) {
            nlength = x[i].toString().length - 1
            for (j=0; j < nlength; j++) {
                if (Number(x[i][j]) > j && x[i] !== " ") {
                    x.splice(i,1," ")
                }
            }
        }
        x = x.filter(function(value,index,arr) {
            if (value !== " ") {
                return value;
            }
        })
        for (i=0; i < x.length; i++) {
            let targetDir = "./" + x[i].match(/.{1}/g).join("/") + "/";
            if (!fs.existsSync(targetDir)) {
                fs.mkdirSync(targetDir,{ recursive: true });
            }
            if (!fs.existsSync(targetDir + "path.txt")) {
                fs.writeFileSync(targetDir + 'path.txt',targetDir);
            }
        }
    }
}

function allPossibleCombinations(input,length,curstr) {
    if(curstr.length == length) return [ curstr ];
    var ret = [];
    for(var i = 0; i < input.length; i++) {
        ret.push.apply(ret,allPossibleCombinations(input,curstr + input[i]));
    }
    return ret;
}

mkdir(6);
,

您可以使用递归path模块[可选]来解决:

const fs = require('fs');
const path = require('path');

// set curPath = __dirname if you want to use absolute path
function makeDir(depth,index = 0,curPath = './') { 
  if (index >= depth) {
    return;
  } else {
    let numFold = index;
    do {
      const relativePath = path.join(curPath,`${numFold}`);
      fs.mkdirSync(relativePath,{ recursive: true });
      fs.writeFileSync(path.join(relativePath,'path.txt'),relativePath);
      makeDir(depth,index + 1,relativePath);
      numFold--;
    } while (numFold >= 0);
  }
}

makeDir(5);

说明

  • 使用递归创建嵌套目录。
  • 使用 do-while 循环生成每个深度的目录数。
  • 使用 path.join 此函数采用可变数量的参数,将它们连接在一起,并规范化路径。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。