Node.js fs 모듈 원리 및 흔한 용도

7533 단어 Nodejsfs모듈
JavaScript는 파일을 조작할 능력이 없지만 Node는 할 수 있습니다. Node는 운영 파일 시스템 모듈을 제공합니다. 이것은 Node에서 매우 중요하고 고주파를 사용하는 모듈로 절대적으로 파악해야 할 모듈 시스템입니다.
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
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기