一、创建目录
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) {}
备注:
- 使用递归创建目录时, 即
recursive: true
会返回创建的第一个目录路径
// 异步的递归创建目录
fs.mkdir(fileDir, { recursive: true }, (err, path) => {
if (err) throw err
console.log('只有使用递归创建目录时,才会返回创建的第一个目录路径:', path)
})
- 若
options
是整数,则该值是一个操作系统的权限值
,比如 777 、666等
fs.mkdir(path, 777, err => {})
- path 是已存在目录时:
- 若是递归创建目录,则不会报错,不是递归则会报错
// dirName1 若已存在也不会报错 // dirName2 若已存在也不会报错 fs.mkdir('/dirName1/dirName2', { recursive: true }, (err, path) => { if (err) throw err console.log('只有使用递归创建目录时,才会返回创建的第一个目录路径:', path) })
- 但是在 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
}
}