바르고 뜨겁게

Javascript - fs(파일 시스템) 프로미스 동기 처리 본문

자바스크립트/Vanilla Js

Javascript - fs(파일 시스템) 프로미스 동기 처리

RightHot 2020. 11. 17. 23:55

Javascript - fs(파일 시스템)

fs 모듈 : 로컬의 파일 및 폴더를 읽기/쓰기/삭제 가능

사용법

  1. 비동기 방식

     const fs = require('fs');
     
     fs.readFile('./readme.txt', (err, data) => {
       if (err) { throw err; }
       console.log(data.toString());
     });

  2. 동기 방식

     const fs = require('fs');
     
     const data = fs.readFileSync('./readme.txt')
     console.log(data.toString());

  3. 프로미스 방식

     const fs = require('fs').promises;
     
     fs.readFile('./readme.txt')
      .then((data) =>
         console.log(data.toString());
      })
      .catch((err) => {
         console.error(err);
      });
     

메서드

  • fs.access(경로, 옵션, 콜백) : 접근 가능 여부 체크

  • fs.mkdir(경로, 콜백) : 폴더 생성

  • fs.open(경로, 옵션, 콜백) : 파일의 아이디(fd 변수)를 가져옴. 파일이 없으면 파일을 생성 하므로 파일 생성에 사용가능

  • fs.write() : w 쓰기 , r 읽기 , a 추가 가능.

  • fs.rename(기존경로, 새경로, 콜백) : 파일 이름 변경 및 이동

  • fs.readdir(경로, 콜백) : 폴더 내용 확인

  • fs.unlink : 파일 삭제

  • fs.rmdir : 폴더 삭제

예제

Promise를 사용하여 비동기 방식의 fs 메서드를 동기처리함.

  1. 폴더 여부 체크 후 없으면 폴더 생성

  2. 파일 여부 체크 후 없으면 파일 생성

  3. 파일에 쓰기 및 읽기 실행

 'use strict';
 const fs = require('fs'); // fs 프로미스가 있지만 직접 만들어 봄.
 
 
 const isAccessCheck = async (getPath) => {
     return new Promise((resolve, reject) => {
         fs.access(getPath, fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, (err) => {
             if (err) {
                 if (err.code === 'ENOENT') {
                     resolve(false)
                } else {
                     reject(err)
                }
            } else {
                 resolve(true)
            }
        });
    })
 }
 
 const makeDir = async (getPath) => {
     return new Promise((resolve, reject) => {
         fs.mkdir(getPath, (err) => {
             if (err) {
                 reject(err)
            } else {
                 console.log(getPath + ' make 성공');
                 resolve()
            }
        });
    })
 }
 
 const makeFile = async (getPath) => {
     return new Promise((resolve, reject) => {
         fs.open(getPath, 'w', (err, fd) => {
             if (err) {
                 reject(err)
            } else {
                 console.log(getPath + ' make 성공');
                 resolve()
            }
        });
    })
 }
 
 const writeFile = async (getPath, contents) => {
     return new Promise((resolve, reject) => {
         const writeStream = fs.createWriteStream(getPath);
 
         // 이벤트 리스너
         writeStream.on('finish', () => { resolve() })
         writeStream.write(contents)
         writeStream.end();
    })
 }
 
 const readFile = async (getPath) => {
     return new Promise((resolve, reject) => {
         fs.readFile(getPath, (err, data) => {
             if (err) {
                 reject(err)
            } else {
                 resolve(data)
            }
        });
    })
 }
 
 
 // ************************************************************************************* //
 
 const dirPath = './src';
 const fileName = 'readme.txt';
 
 isAccessCheck(dirPath)
    .then((isAccess) => {
         console.log(dirPath + ' 존재 여부 : ' + isAccess);
         if (isAccess) {
             return
        } else {
             return makeDir(dirPath);
        }
    })
    .then(() => {
         return isAccessCheck(dirPath + '/' + fileName)
    })
    .then((isAccess) => {
         console.log(dirPath + '/' + fileName + ' 존재 여부 : ' + isAccess);
         if (isAccess) {
             return
        } else {
             return makeFile(dirPath + '/' + fileName);
        }
    })
    .then(() => {
         return writeFile(dirPath + '/' + fileName, '가나다라마바사\n아 자차카 타파하하')
    })
    .then(() => {
         return readFile(dirPath + '/' + fileName)
    })
    .then((data) => {
         console.log(dirPath + '/' + fileName + " 파일 읽기 :\n" + data.toString())
    })
    .catch((errData) => console.error(errData))

console

 ./src 존재 여부 : false
 ./src make 성공
 ./src/readme.txt 존재 여부 : false
 ./src/readme.txt make 성공
 ./src/readme.txt 파일 읽기 :
 가나다라마바사
 아 자차카 타파하하

Comments