Node.js를 다루면서 약간의 문제가 발견되었습니다. 라는 디렉토리에있는 스크립트가 있습니다 data
. 스크립트가 서브 디렉토리 내의 서브 디렉토리에있는 파일에 일부 데이터를 쓰려고합니다 data
. 그러나 다음과 같은 오류가 발생합니다.
{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }
코드는 다음과 같습니다.
var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
Node.js가 파일에 쓰기 위해 종료되지 않으면 디렉토리 구조를 만드는 방법을 찾는 데 도움이 될 수 있습니까?
답변
노드> 10.12.0
fs.mkdir은 이제 { recursive: true }
다음과 같은 옵션을 허용합니다 .
// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
if (err) throw err;
});
또는 약속 :
fs.promises.mkdir('/tmp/a/apple', { recursive: true }).catch(console.error);
노드 <= 10.11.0
mkdirp 또는 fs-extra 같은 패키지를 사용 하여이 문제를 해결할 수 있습니다 . 패키지를 설치하지 않으려면 아래 Tiago Peres França의 답변을 참조하십시오.
답변
추가 패키지를 사용하지 않으려면 파일을 만들기 전에 다음 함수를 호출하면됩니다.
var path = require('path'),
fs = require('fs');
function ensureDirectoryExistence(filePath) {
var dirname = path.dirname(filePath);
if (fs.existsSync(dirname)) {
return true;
}
ensureDirectoryExistence(dirname);
fs.mkdirSync(dirname);
}
답변
로 노드-FS-추가 하면 쉽게 할 수있다.
설치
npm install --save fs-extra
그런 다음 outputFile
방법을 사용하십시오 . 그것의 문서는 말합니다 :
부모 디렉토리가 존재하지 않는 경우 디렉토리가 생성된다는 점을 제외하면 writeFile과 거의 동일합니다 (즉, 덮어 씁니다).
세 가지 방법으로 사용할 수 있습니다.
콜백 스타일
const fse = require('fs-extra');
fse.outputFile('tmp/test.txt', 'Hey there!', err => {
if(err) {
console.log(err);
} else {
console.log('The file was saved!');
}
})
약속 사용
promises 을 사용 하고 희망이 있다면 이것이 코드입니다.
fse.outputFile('tmp/test.txt', 'Hey there!')
.then(() => {
console.log('The file was saved!');
})
.catch(err => {
console.error(err)
});
동기화 버전
동기화 버전을 원하면 다음 코드를 사용하십시오.
fse.outputFileSync('tmp/test.txt', 'Hey there!')
자세한 내용은 outputFile
설명서 및 모든 node-fs-extra 지원 방법을 확인하십시오 .
답변
뻔뻔한 플러그 경고!
원하는 경로 구조에서 각 디렉토리를 확인하고 존재하지 않는 경우 수동으로 만들어야합니다. 그렇게하는 모든 도구는 이미 Node의 fs 모듈에 있지만 내 mkpath 모듈로 간단하게 모든 작업을 수행 할 수 있습니다 : https://github.com/jrajav/mkpath
답변
아직 댓글을 달 수 없으므로 @ tiago-peres-frança 환상적인 솔루션 (감사합니다!)을 기반으로 향상된 답변을 게시하고 있습니다. 경로에 마지막 디렉토리 만 누락 된 경우 그의 코드는 디렉토리를 만들지 않습니다. 예를 들어 입력은 “C : / test / abc”이고 “C : / test”는 이미 존재합니다. 작동하는 스 니펫은 다음과 같습니다.
function mkdirp(filepath) {
var dirname = path.dirname(filepath);
if (!fs.existsSync(dirname)) {
mkdirp(dirname);
}
fs.mkdirSync(filepath);
}
답변
내 충고는 : 몇 줄의 코드로 쉽게 할 수있을 때 종속성에 의존하지 않도록 노력하십시오 .
14 줄의 코드 로 달성하려는 내용은 다음과 같습니다 .
fs.isDir = function(dpath) {
try {
return fs.lstatSync(dpath).isDirectory();
} catch(e) {
return false;
}
};
fs.mkdirp = function(dirname) {
dirname = path.normalize(dirname).split(path.sep);
dirname.forEach((sdir,index)=>{
var pathInQuestion = dirname.slice(0,index+1).join(path.sep);
if((!fs.isDir(pathInQuestion)) && pathInQuestion) fs.mkdirSync(pathInQuestion);
});
};
답변
이 기능이 필요했기 때문에이 모듈을 방금 게시했습니다.
https://www.npmjs.org/package/filendir
Node.js fs 메소드 주위의 래퍼처럼 작동합니다. 당신은 그것을 정확하게 같은 방법을 사용할 수 있도록 때와 fs.writeFile
와 fs.writeFileSync
(비동기 및 동기 쓰기 모두)