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 trình giám đốc cha một cách đệ 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 các thư mục mẹ một cách đệ 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
- [UPDATE] lỗi xử lý giải pháp nền tảng cụ thể này giống như
EISDIR
cho Mac và EPERM
và EACCES
cho Windows.
- Giải pháp này xử lý cả đường dẫn tương đối và tuyệt đối .
- Trong trường hợp đường dẫn tương đối, các 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 dir script hiện tại, hãy vượt qua
{isRelativeToScript: true}
.
- Sử dụng
path.sep
và path.resolve()
, không chỉ /
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ệ.
- Cách khác để đạt được điều đó có thể là kiểm tra xem tệp có tồn tại hay không rồi tạo tệp đó, tức là
if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
,. Nhưng đây là một mẫu chống khiến mã dễ bị ảnh hưởng bởi các điều kiện chủng tộc.
- Yêu cầu Node v6 và mới hơn để hỗ trợ hủy cấu trúc. (Nếu bạn gặp vấn đề 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)
fs.promises.mkdir(path.dirname('/folder1/folder2/file.txt'), {recursive: true}).then(x => fs.promises.writeFile('/folder1/folder2/file.txt', 'content'))