Node.js fs 모듈 원리 및 흔한 용도
fs 모듈은 매우 많은 인터페이스를 제공합니다. 여기서 주로 자주 사용하는 인터페이스를 설명합니다.
1. 일반 API 빠른 복습
fs.stat 파일인지 디렉터리인지 검사하기
const fs = require('fs')
fs.stat('hello.js', (error,stats)=>{
if(error) {
console.log(error)
} else {
console.log(stats)
console.log(` :${stats.isFile()}`)
console.log(` :${stats.isDirectory()}`)
}
})
fs.mkdir 디렉터리 만들기
const fs = require('fs')
fs.mkdir('logs', error => {
if(error) {
console.log(error)
} else {
console.log(' !')
}
})
fs.rmdir 디렉터리 삭제
const fs = require('fs')
fs.rmdir('logs', error => {
if(error) {
console.log(error)
} else {
console.log(' logs')
}
})
fs.writeFile 쓰기 파일 만들기
const fs = require('fs')
fs.writeFile('logs/hello.log',' ~
', error => {
if(error) {
console.log(error)
} else {
console.log(' ');
}
})
fs.appendFile 추가 파일
const fs = require('fs')
fs.appendFile('logs/hello.log','hello~
', error => {
if(error) {
console.log(error)
} else {
console.log(' ');
}
})
fs.readFile 읽기 파일
const fs = require('fs')
fs.readFile('logs/hello.log','utf-8', (error, data) => {
if(error) {
console.log(error)
} else {
console.log(data);
}
})
fs.unlink 파일 삭제
const fs = require('fs')
fs.unlink(`logs/${file}`, error => {
if(error) {
console.log(error)
} else {
console.log(` : ${file}`)
}
})
fs.readdir 읽기 디렉터리
const fs = require('fs')
fs.readdir('logs', (error, files) => {
if(error) {
console.log(error)
} else {
console.log(files);
}
})
fs.rename 이름 바꾸기, 파일 저장 경로 변경
const fs = require('fs')
fs.rename('js/hello.log', 'js/greeting.log', error => {
if(error) {
console.log(error)
} else {
console.log(' ')
}
})
2. 제3자 npm 패키지 mkdirp의 사용mkdirp는 폴더를 만들 수 있을 뿐만 아니라 여러 층의 폴더도 만들 수 있습니다. mkdir-p 명령과 유사합니다
midir -p tmp/foo/bar/baz
위의 명령은 현재 디렉터리에 여러 폴더를 만들 수도 있습니다.
다음 코드는 현재 디렉터리에 다중 레벨 폴더를 생성합니다
const mkdirp = require('mkdirp')
mkdirp('tmp/foo/bar/baz').then (made=>console.log (` 디렉터리 만들기: ${made}`)
//디렉토리 만들기:/Users/zhangbing/github/CodeTest/Node/fs/tmp
3. 실전 예시
실전
서버에 업로드 디렉터리가 있는지 판단합니다.없으면 이 디렉터리를 만들고, 있으면 조작하지 않습니다.
const fs = require('fs')
const path = './upload'
fs.stat(path, (err, data) => {
if(err) {
//
mkdir(path)
return
}
if(data.isDirectory()) {
console.log('upload ');
}else{
// ,
fs.unlink(path, err => {
if(!err) {
mkdir(path)
}
})
}
})
function mkdir(dir) {
fs.mkdir(dir, err => {
if(err) {
console.log(err);
return
}
})
}
실전wwwroot 폴더 아래에 images css js와 index가 있습니다.html, wwwroot 디렉터리 아래의 모든 디렉터리를 찾아서 하나의 그룹에 넣습니다
동기화 방법 사용
const fs = require('fs')
const path = './wwwroot'
const dirArr = []
const dirs = fs.readdirSync(path)
dirs.forEach(item => {
if(fs.statSync(path + '/' + item).isDirectory()) {
dirArr.push(item)
}
})
console.log('dirArr', dirArr)
// dirArr [ 'css', 'images', 'js' ]
async/await 방식 사용하기
const fs = require('fs')
const path = './wwwroot'
const dirArr = []
function isDir(path) {
return new Promise((resolve, reject) => {
fs.stat(path, (error, stats) => {
if(error) {
console.log(error)
reject(error)
return
}
if(stats.isDirectory()) {
resolve(true)
} else {
resolve(false)
}
})
})
}
function main(){
fs.readdir(path, async (error, data) => {
if(error) {
console.log(error)
return
} else {
for(let i = 0; i < data.length; i++) {
if(await isDir(path + '/' + data[i])) {
dirArr.push(data[i])
}
}
console.log('dirArr', dirArr)
}
})
}
main() // dirArr [ 'css', 'images', 'js' ]
4. 파이프 흐름파이프는 출력이 입력 흐름으로 흐르는 메커니즘을 제공했다.일반적으로 우리는 한 흐름에서 데이터를 얻고 다른 흐름으로 전달하는 데 사용된다.다음 예제에서는 파일 내용을 읽고 다른 파일에 기록합니다.
const fs = require("fs")
//읽을 수 있는 흐름 만들기
const readerStream = fs.createReadStream('input.txt')
//쓰기 가능 스트림 만들기
const writerStream = fs.createWriteStream('output.txt')
//파이프 읽기 및 쓰기 작업
//읽기 input.txt 파일 내용을 출력에 기록합니다.txt 파일
readerStream.pipe(writerStream)
console.log("프로그램 완료")
fs.createReadStream 파일 흐름에서 데이터 읽기
const fs = require('fs')
const fileReadStream = fs.fileReadStream('demo1.js')
let count = 0
let str = ''
fileReadStream.on('data', chunk => {
console.log(`${++count} :${chunk.length}`)
str += chunk
})
fileReadStream.on('end', () => {
console.log('--- ---')
console.log(count + ',' + star)
})
fileReadStream.on('error', error => {
console.log(error)
})
fs.createWriteStream 파일 쓰기const fs = require("fs")
const data ='데이터베이스에서 얻은 데이터입니다. 저장하려고 합니다.'
//파일에 쓸 수 있는 흐름을 만듭니다.txt에서
const writerStream = fs.createWriteStream('output.txt')
//utf8 인코딩으로 데이터 쓰기
writerStream.write(data,'UTF8')
//태그 파일 끝
writerStream.end()
//흐름 이벤트 처리 -->finish 이벤트
writerStream.on('finish', () => {
/*finish - 모든 데이터가 레이어 시스템에 기록되었을 때 트리거됩니다. */
console.log(쓰기 완료.)
})
writerStream.on('error', err => {
console.log(err.stack);
})
console.log("프로그램 완료")
실전: 사진 복사
프로젝트 루트 디렉터리에 그림 2020이 있습니다.png,/wwwroot/images로 복사
코드는 다음과 같습니다.
const fs = require("fs")
const readStream = fs.createReadStream('./2020.png')
const writeStream = fs.createWriteStream('./wwwroot/images/2021.png')
readStream.pipe(writeStream)
특히 주의해야 할 것은, fs.createWriteStream에서 쓸 디렉터리는 복사할 파일 이름을 가지고 있어야 합니다. 즉, fs로 쓸 수 없습니다.createWriteStream("./wwwroot/images/") 그렇지 않으면 macOS에서 다음과 같은 오류가 발생합니다.
Error: EISDIR: illegal operation on a directory, open
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
NestJs Guard하지만 가드는 ExcutionContext를 사용할 수 있기 때문에 다음에 어떠한 라우트 핸들러가 실행되는지 정확하게 알 수 있다. ExecutionContext는 ArgumentsHost를 상속 받았기 때문에 각 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.