nodeJS - 기타 fs 메소드


fs는 단순히 파일 읽기/쓰기 뿐만 아니라 파일을 생성하고 삭제할 수 있으며 폴더를 생성하고 삭제할 수 있다.

  • 폴더 및 파일 생성 하기

fsCreate.js

const fs = require('fs').promises;
const constants = require('fs').constants;
  • fs.access(‘경로’, 옵션, 콜백) : 폴더나 파일에 접근 할 수 있는지 체크. 두번째 인수로 constants로 상수들을 넣는다. F_OK는 파일 존재 여부, R_OK는 읽기 권한 여부, W_OK는 쓰기 권한 여부를 체크한다. 파일/폴더나 권한이 없다면 에러가 발생하는데 파일/폴더가 없을 때의 에러코드는 ENOENT이다.
fs.access('./folder', constants.F_OK | constants.W_OK | constants.R_OK)
    .then(() => {
        return Promise.reject('이미 폴더 있음');
    })
    .catch((err) => {
        if (err.code === 'ENOENT') {
            console.log('폴더 없음');
            // fs.mkidr('경로', 콜백) : 폴더를 만드는 메서드. 이미 폴더가 있다면 에러가 발생하므로 먼저 access 메서드를 호출해서 확인하는 것이 중요하다.
            return fs.mkdir('./folder');
        }
        return Promise.reject(err);
    })
    .then(() => {
        console.log('폴더 만들기 성공');
        // fs.open(경로, 온셥, 콜백): 파일의 아이디(fd 변수)를 가져오는 메서드. 파일이 없다면 파일을 생성한 뒤 그 아이디를 가져온다. 가져온 아이디를 사용해 읽거나(fs.read) 쓸 수(fs.write) 있다. 
        // 2번째 인수로 어떤 동작을 할 것인지 설정 가능. ('w' 쓰기 / 'r' 읽기 / 'a' 기존 파일에 추가)
        return fs.open('./folder/file.js', 'w');
    })
    .then((fd) => {
        console.log('빈 파일 만들기 성공', fd);
        // fs.rename(기존 경로, 새 경로, 콜백) : 파일의 이름을 바꾸는 메서드. 기존 파일 위치와 새로운 파일 위치를 저으면 된다. 꼭 같은 폴더를 저장할 필요는 없으므로 잘라내기와 같은 기능을 할 수 도 있다.
        fs.rename('./folder/file.js', './folder/newfile.js');
    })
    .then(() => {
        console.log('이름 바꾸기 성공')
    })
    .catch((err) => {
        console.error(err);
    });
  • 폴더 내용 확인 및 삭제

fsDelete.js

const fs = require('fs').promises;

// fs.readdir(경로, 콜백) : 폴더 안의 내용물을 확인. 배열 안에 내부 파일과 폴더명이 나온다.
fs.readdir('./folder')
    .then((dir) => {
        console.log('폴더 내용 확인', dir);
        // 폴더 내용 확인 [ 'newfile.js' ]

        // fs.unlink(경로, 콜백): 파일을 삭제한다. 파일이 없다면 에러가 발생하므로 파일이 있는지 꼭 확인해야한다.
        return fs.unlink('./folder/newFile.js');
    })
    .then(() => {
        console.log('파일 삭제 성공')
        // fs.rmdir(경로, 콜백) : 폴더를 삭제한다. 폴더 안에 파일들이 있다면 에러가 발생하므로 먼저 내부 파일을 모두 지우고 호출해야한다.
        return fs.rmdir('./folder');
    })
    .then(() => {
        console.log('폴더 삭제 성공');
    })
    .catch((err) => {
        console.error(err);
    });

위 코드를 한번 더 실행($ node fsDelete)하면 (존재하지 않는 파일을 지웠으므로) ENOENT 에러가 발생

[Error: ENOENT: no such file or directory, scandir './folder'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'scandir',
  path: './folder'
}
  • 파일 복사하기2

노드 8.5 버전 이후에는 createReadStream과 createWriteStream을 pipe하지 않아도 파일 복사가 가능하다.

const fs = require('fs').promises;

// fs.copyFile('복사할 파일', '복사될 경로', 콜백 함수)
fs.copyFile('readme4.txt', 'writeme4.txt')
    .then(() => {
        console.log('복사 완료');
    })
    .catch((error) => {
        console.error(error);
    });
  • watch 메서드 : 파일/폴더의 변경 사항 감시
const fs = require('fs');

fs.watch('./target.txt', (eventType, filename) => {
    console.log(eventType, filename);
});

// 위 코드를 실행후 target.txt의 내용 또는 파일 변을 변경하면 터미널 console에 표기

// 내용 변경
// change target.txt
// change target.txt
// change 이벤트가 2번씩 발생 하기도 하므로 실무에서 사용할 때 주의해야한다.

// 폴더 변경 및 삭제
// rename change_target.txt
// rename 이벤트 이후 더 이상 watch가 수행 되지않는다. 





© 2020.11. by creamer

Powered by CREAMer