用里面的文件创建多个文件夹

时间:2017-12-07 03:06:49

标签: node.js

我正在尝试创建一个简单的CLI,它将创建一个文件夹结构和一些文件。结构看起来像这样:

app-name
├── app.py
├── models.py
├── static
│   ├── css
│   ├── img
│   └── js
├── templates
└── views.py

我已经看了mkdirp库,但我意识到我必须为我想要制作的每个文件夹链接mkdirp()函数,然后使用fs模块创建单个文件。

到目前为止,我所尝试的是为我要创建的每个文件夹背靠背链接mkdirp()函数。

const path = require('path');
const mkdirp = require('mkdirp-promise');

mkdirp(path.join(__dirname, 'app-name', 'static', 'css'))
    .then(mkdirp(path.join(__dirname, 'app-name', 'static', 'js')))
    .then(mkdirp(path.join(__dirname, 'app-name', 'static', 'img')))
    .then(mkdirp(path.join(__dirname, 'app-name', 'templates')))
    .then(console.log)
    .catch(console.error);

这种方法似乎效率不高,特别是对于可以传递给CLI的不同类型的参数。

我考虑过创建一个包含整个文件夹结构的文件夹以及Python文件的内容,然后只复制这些文件。但我不确定这是否可行。

创建此文件夹和文件层次结构的好方法是什么?

2 个答案:

答案 0 :(得分:0)

要完全按照您的要求进行操作有点困难。如果你只是想要可靠地创建几个目录,那么我只想创建一个带有一系列路径的函数,你可以使用.reduce()在数组中连续迭代:

const path = require('path');
const mkdirp = require('mkdirp-promise');

function makeAllDirs(root, list) {
    return list.reduce((p, item) => {
        return p.then(() => {
            return mkdirp(path.join(root, item));
        });
    }, Promise.resolve());
}

// usage

let dirs = [
    "app-name/static/css",
    "app-name/static/img",
    "app-name/static/js",
    "app-name/templates"
];

makeAllDirs(__dirname, dirs).then(() => {
   // all done here
}).catch(err => {
   // error here
});

答案 1 :(得分:0)

根据您的输入,这完全符合您的要求(如果用户提供结构,这可能不是最好的方法):

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');

function createDirectory(dirPath) {

  return promisify(fs.mkdir)(dirPath);

}

function createFile(filePath, content) {

  return promisify(fs.writeFile)(filePath, content, 'utf-8');

}

function scaffoldProject(projectName) {

  createDirectory(path.join(__dirname, projectName))
  .then(() => {

    return createDirectory(path.join(__dirname, projectName, 'static'));

  })
  .then(() => {

    return createDirectory(path.join(__dirname, projectName, 'templates'));

  })
  .then(() => {

    return createDirectory(path.join(__dirname, projectName, 'static', 'css'));

  })
  .then(() => {

    return createDirectory(path.join(__dirname, projectName, 'static', 'img'));

  })
  .then(() => {

    return createDirectory(path.join(__dirname, projectName, 'static', 'js'));

  })
  .then(() => {

    // Last argument is the app.py's content
    return createFile(path.join(__dirname, projectName, 'app.py'), '');

  })
  .then(() => {

    // Last argument is the models.py's content
    return createFile(path.join(__dirname, projectName, 'models.py'), '');

  })
  .then(() => {

    // Last argument is the views.py's content
    return createFile(path.join(__dirname, projectName, 'views.py'), '');

  })
  .then(() => {

    console.log(`Project ${projectName} was successfully scaffolded at ${path.join(__dirname, projectName)}`);

  })
  .catch(error => {

    console.log(error);

  });

}

// Replace 'test-project' with user input
scaffoldProject('test-project');

这使用fs模块并将其回调API转换为Promise API(promisifies)。您拨打createDirectorycreateFile然后使用.then()进行链接以控制流量。 .catch()捕获链中抛出的任何错误。