Biên tập
Phiên bản NodeJS 10.12.0
đã thêm một hỗ trợ riêng cho cả hai mkdir
và mkdirSync
để tạo một thư mục đệ quy với recursive: true
tùy chọn như sau:
fs.mkdirSync(targetDir, { recursive: true });
Và nếu bạn thích fs Promises API
, bạn có thể viết
fs.promises.mkdir(targetDir, { recursive: true });
Câu trả lời gốc
Tạo thư mục đệ quy nếu chúng không tồn tại! ( Không phụ thuộc )
const fs = require('fs');
const path = require('path');
function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) {
const sep = path.sep;
const initDir = path.isAbsolute(targetDir) ? sep : '';
const baseDir = isRelativeToScript ? __dirname : '.';
return targetDir.split(sep).reduce((parentDir, childDir) => {
const curDir = path.resolve(baseDir, parentDir, childDir);
try {
fs.mkdirSync(curDir);
} catch (err) {
if (err.code === 'EEXIST') { // curDir already exists!
return curDir;
}
// To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure.
throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
}
const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) {
throw err; // Throw if it's just the last created dir.
}
}
return curDir;
}, initDir);
}
Sử dụng
// Default, make directories relative to current working directory.
mkDirByPathSync('path/to/dir');
// Make directories relative to the current script.
mkDirByPathSync('path/to/dir', {isRelativeToScript: true});
// Make directories with an absolute path.
mkDirByPathSync('/path/to/dir');
Bản giới thiệu
Thử nó!
Giải thích
- [CẬP NHẬT] Giải pháp này xử lý các lỗi
EISDIR
dành riêng cho nền tảng như cho Mac EPERM
và EACCES
cho Windows. Cảm ơn tất cả các ý kiến báo cáo của @PediT., @JohnQ, @ deed02392, @robyoder và @Almenon.
- Giải pháp này xử lý cả đường dẫn tương đối và tuyệt đối . Cảm ơn bình luận của @john.
- Trong trường hợp đường dẫn tương đối, thư mục đích sẽ được tạo (giải quyết) trong thư mục làm việc hiện tại. Để giải quyết chúng liên quan đến thư mục script hiện tại, hãy vượt qua
{isRelativeToScript: true}
.
- Sử dụng
path.sep
và path.resolve()
, không chỉ /
ghép nối, để tránh các vấn đề đa nền tảng.
- Sử dụng
fs.mkdirSync
và xử lý các lỗi với try/catch
nếu ném để xử lý điều kiện chủng tộc: quá trình khác có thể thêm các tập tin giữa các cuộc gọi đến fs.existsSync()
và fs.mkdirSync()
và gây ra một ngoại lệ.
- Một cách khác để đạt được điều đó có thể là kiểm tra nếu một tệp tồn tại rồi tạo nó, tức là
if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
. Nhưng đây là một mô hình chống khiến mã dễ bị tổn thương trong điều kiện chủng tộc. Cảm ơn @GershomMaes bình luận về kiểm tra sự tồn tại của thư mục.
- Yêu cầu Node v6 và mới hơn để hỗ trợ phá hủy. (Nếu bạn gặp sự cố khi triển khai giải pháp này với các phiên bản Node cũ, hãy để lại nhận xét cho tôi)