Node.js의 문서를 이미 읽었으며 무언가를 놓치지 않으면 특정 작업, 특히 매개 변수에 포함 된 내용을 알려주지 않습니다 fs.mkdir()
. 문서에서 볼 수 있듯이 그리 많지는 않습니다.
현재이 코드가 있는데 폴더를 만들거나 기존 폴더를 대신 사용하려고합니다.
fs.mkdir(path,function(e){
if(!e || (e && e.code === 'EEXIST')){
//do something with contents
} else {
//debug
console.log(e);
}
});
그러나 이것이 올바른 방법인지 궁금합니다. EEXIST
폴더가 이미 존재하는지 알 수있는 올바른 방법으로 코드를 확인하고 있습니까? fs.stat()
디렉토리를 만들기 전에 할 수 있다는 것을 알고 있지만 파일 시스템에는 이미 두 가지가 있습니다.
둘째, 오류 객체에 포함 된 내용, 매개 변수의 의미 등에 대한 세부 정보가 포함 된 Node.js에 대한 완전하거나 더 자세한 설명서가 있습니까?
답변
이를 수행하는 좋은 방법은 mkdirp 모듈 을 사용하는 것 입니다.
$ npm install mkdirp
디렉토리가 필요한 기능을 실행하는 데 사용하십시오. 경로가 생성 된 후 또는 경로가 이미 존재하면 콜백이 호출됩니다. err
mkdirp가 디렉토리 경로를 작성하지 못한 경우 오류 가 설정됩니다.
var mkdirp = require('mkdirp');
mkdirp('/tmp/some/path/foo', function(err) {
// path exists unless there was an error
});
답변
편집하다: 이 답변은 매우 인기가 있기 때문에 최신 사례를 반영하도록 업데이트했습니다.
노드> = 10
{ recursive: true }
노드의 새로운 옵션fs
이제 이것을 기본적으로 허용합니다. 이 옵션은 UNIX의 동작을 모방합니다.mkdir -p
. 재귀 적으로 경로의 모든 부분이 존재하는지 확인하고 어떤 경우에도 오류가 발생하지 않습니다.
(참고 : 여전히 EPERM
또는EACCESS
때문에 더 나은 여전히하는에 포장try {} catch (e) {}
구현이에 취약합니다.)
동기식 버전.
fs.mkdirSync(dirpath, { recursive: true })
비동기 버전
await fs.promises.mkdir(dirpath, { recursive: true })
이전 노드 버전
사용하여 try {} catch (err) {}
경쟁 조건을 겪지 않고 매우 우아하게 달성 할 수 있습니다.
존재 여부 확인과 디렉토리 작성 사이의 데드 타임을 방지하기 위해 디렉토리를 바로 작성하고 오류가있는 경우 무시합니다. EEXIST
(디렉토리가 이미 존재하는 경우) .
오류가없는 경우 EEXIST
, 그러나, 우리는 우리가 같은 취급 될 수 있기 때문에, 오류가 발생한다고 EPERM
나EACCES
function ensureDirSync (dirpath) {
try {
return fs.mkdirSync(dirpath)
} catch (err) {
if (err.code !== 'EEXIST') throw err
}
}
들어 mkdir -p
-like 재귀 행동, 예를 들어 ./a/b/c
, 당신은 dirpath의 모든 부분에 전화를해야 할 것, 예를 들면 ./a
, ./a/b
,.a/b/c
답변
빠르고 더러운 하나의 라이너를 원한다면 다음을 사용하십시오.
fs.existsSync("directory") || fs.mkdirSync("directory");
답변
에 대한 node.js 문서 fs.mkdir
기본적으로에 대한 Linux 매뉴얼 페이지를 참조하십시오 mkdir(2)
. 그것은EEXIST
경로가 존재하지만이 경로를 이동하는 경우 어색한 코너 케이스를 생성하는 디렉토리가 아닌 경우에도 표시됩니다.
전화하는 것이 더 나을 수도 있습니다 fs.stat
경로가 존재하는지 여부와 단일 호출의 디렉토리인지 알려주는 이 . 디렉토리가 이미 존재하는 일반적인 경우 (단일 가정)의 경우 단일 파일 시스템 적중입니다.
이 fs
모듈 메소드는 네이티브 C API를 둘러싼 씬 래퍼이므로 자세한 내용은 node.js 문서에서 참조 된 매뉴얼 페이지를 확인해야합니다.
답변
이것을 사용할 수 있습니다 :
if(!fs.existsSync("directory")){
fs.mkdirSync("directory", 0766, function(err){
if(err){
console.log(err);
// echo the result back
response.send("ERROR! Can't make the directory! \n");
}
});
}
답변
모듈이없는 솔루션을 제안합니다 (누적 모듈은 특히 몇 줄로 작성할 수있는 작은 기능의 유지 관리를 위해 권장되지 않습니다 …) :
마지막 업데이트 :
v10.12.0에서 NodeJS 구현 재귀 옵션 :
// Create recursive folder
fs.mkdir('my/new/folder/create', { recursive: true }, (err) => { if (err) throw err; });
업데이트 :
// Get modules node
const fs = require('fs');
const path = require('path');
// Create
function mkdirpath(dirPath)
{
if(!fs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK))
{
try
{
fs.mkdirSync(dirPath);
}
catch(e)
{
mkdirpath(path.dirname(dirPath));
mkdirpath(dirPath);
}
}
}
// Create folder path
mkdirpath('my/new/folder/create');
답변
자주 사용되는 파일 작업을 제공하는 fs-extra를 사용할 수도 있습니다 .
샘플 코드 :
var fs = require('fs-extra')
fs.mkdirs('/tmp/some/long/path/that/prob/doesnt/exist', function (err) {
if (err) return console.error(err)
console.log("success!")
})
fs.mkdirsSync('/tmp/another/path')
여기에 문서 : https://github.com/jprichardson/node-fs-extra#mkdirsdir-callback