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
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM