[javascript] Node.js는 폴더를 만들거나 기존 폴더를 사용합니다

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

디렉토리가 필요한 기능을 실행하는 데 사용하십시오. 경로가 생성 된 후 또는 경로가 이미 존재하면 콜백이 호출됩니다. errmkdirp가 디렉토리 경로를 작성하지 못한 경우 오류 가 설정됩니다.

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, 그러나, 우리는 우리가 같은 취급 될 수 있기 때문에, 오류가 발생한다고 EPERMEACCES

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