nodejs 创建目录

一、创建目录

文档参考地址

1. 常用创建目录方式

const fs = require(\'fs\')
const path = require(\'path\')
let fileDir1 = path.resolve(__dirname, \'./fileDir1\')
let fileDir2 = path.resolve(__dirname, \'./fileDir1/fileDir2\')
// 异步创建目录
fs.mkdir(fileDir1, err => {
    if (err) throw err
    console.log(\'创建成功\')
})

// 异步的递归创建目录
fs.mkdir(fileDir2, { recursive: true }, (err, path) => {
    if (err) throw err
    console.log(\'只有使用递归创建目录时,才会返回创建的第一个目录路径:\', path)
})

2. 语法说明

/*
 * 异步创建目录
 * @param path {string | Buffer | URL |} 目录名
 * @param options {Object | integer}
 *          recursive {boolean}, 是否递归创建多层目录,默认值为 false
 *          mode {string | integer}, 创建目录是赋予的权限,Windows 上不支持,默认为 0o777
 * @param callback {Function} 回调函数
 *          err {Error} 创建目录时抛出的错误
 *          path? {string} 使用递归创建目录时,会返回创建的第一个目录路径
 */
function mkdir(path[, options], callback) {}

备注:

  1. 使用递归创建目录时, 即 recursive: true 会返回创建的第一个目录路径
// 异步的递归创建目录
fs.mkdir(fileDir, { recursive: true }, (err, path) => {
    if (err) throw err
    console.log(\'只有使用递归创建目录时,才会返回创建的第一个目录路径:\', path)
})
  1. options 是整数,则该值是一个操作系统的 权限值,比如 777 、666等
fs.mkdir(path, 777, err => {})
  1. path 是已存在目录时:
    1. 若是递归创建目录,则不会报错,不是递归则会报错
    // dirName1 若已存在也不会报错
    // dirName2 若已存在也不会报错
    fs.mkdir(\'/dirName1/dirName2\', { recursive: true }, (err, path) => {
        if (err) throw err
        console.log(\'只有使用递归创建目录时,才会返回创建的第一个目录路径:\', path)
    })
    
    1. 但是在 Windows 上,创建根目录,即使是递归创建也会报错
    // Windows 下
    fs.mkdir(\'/\', { recursive: true }, (err, path) => {
        // err:
        // { [Error: EPERM: operation not permitted, mkdir \'d:\\'] errno: -4048, code: \'EPERM\', syscall: \'mkdir\', path: \'d:\\\' }
        if (err) throw err
    })
    

二、同步创建目录

功能和参数与该接口的 异步 API 类似,只是参数少了 回调函数

返回 undefined 或者 递归创建时返回 第一个创建的目录路径

const fs = require(\'fs\')
fs.mkdirSync(path[, options])

三、自己实现创建多层级目录

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

let dirname = path.resolve(__dirname, \'./dirName1/dirName2/dirName3\')

// 递归创建目录
function mkdirRecursive(dirname) {
    // 判断是否存在当前 path 的最后一层目录
    if (fs.exsitsSync(dirname)) 
        // 存在,则不做操作,直接返回
        return true
    
    // 若不存在,则判断当前 path 倒数第二层目录是否存在
    // path.dirname 可以获取当前路径的上一层路径
    // 例如: /dirName1/dirName2/dirName3
    // path.dirname(\'/dirName1/dirName2/dirName3\') // /dirName1/dirName2
    if (mkdirRecursive(path.dirname(dirname))) {
        // 若存在,则在当前目录,创建下一层目录
        fs.mkdirSync(dirname)
        return true
    }

}