Node.js 파일 읽기, 쓰기, 삭제 (fs)

Node.js의 fs 모듈은 File System을 다루는 내장 모듈입니다.

파일이나 디렉토리의 생성, 읽기, 쓰기, 삭제, 복사, 이동 등 다양한 작업을 수행할 수 있게 해줍니다.

비동기/동기 방식 둘 다 지원하며, 매우 자주 사용되는 핵심 모듈입니다.

모듈 사용법

이 모듈을 사용하려면 require로 모듈을 불러와야 합니다.

const fs = require('fs');

동기 vs 비동기

  • fs.readFile (비동기)
  • fs.readFileSync (동기)

Node.js에서는 메소드 호출 시 비동기 방식을 권장하지만 경우에 따라 동기 방식이 필요한 경우도 있습니다.

주로 CLI 스크립트나 초기화로직 같은 경우가 이에 해당됩니다.

fs 파일 읽기

// 비동기 방식
fs.readFile('파일경로.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});

// 동기 방식
const data = fs.readFileSync('파일경로.txt', 'utf8');
console.log(data);

readFile() 메소드는 파일을 읽을 때 사용할 수 있습니다.

첫 번째 매개변수로 파일의 경로를 전달하고, 두 번째 매개변수로 인코딩이나 flag를 전달합니다.

마지막 매개변수로 전달한 콜백 함수에서는 파일을 읽은 결과를 받을 수 있습니다.

resdFileSync() 메소드가 비동기 방식과 다른 점은 파일 읽기 결과를 리턴 값으로 전달한다는 점 입니다.

fs 파일 쓰기

// 비동기 방식
fs.writeFile('파일경로.txt', '내용', 'utf8', (err) => {
  if (err) throw err;
  console.log('파일이 저장됨');
});

// 동기 방식
fs.writeFileSync('파일경로.txt', '내용', 'utf8');

writeFile() 메소드로 파일에 내용을 쓸 수 있습니다.

매개변수로 파일의 경로와 쓸 내용, 옵션을 전달하고 콜백 함수로 저장 결과를 볼 수 있습니다.

기존에 파일이 있었다면 기본적으로 덮어쓰기를 하지만 옵션을 통해 쓰기 행동을 지정할 수 있습니다.

fs 파일 존재 여부 확인

fs.exists('파일.txt', (exists) => {
  console.log(exists ? '있음' : '없음');
});

먼저 exists() 메소드를 사용해 해당 파일이 존재하는지 확인할 수 있습니다.

하지만 이는 예전 방식으로 추천하지는 않습니다.

fs.access('파일.txt', fs.constants.F_OK, (err) => {
  if (err) {
    console.log('파일 없음');
  } else {
    console.log('파일 있음');
  }
});

권장하는 방법은 access() 메소드를 사용하여 파일의 상태를 확인하는 것 입니다.

fs 파일 삭제

fs.unlink('파일경로.txt', (err) => {
  if (err) throw err;
  console.log('파일 삭제됨');
});

파일을 삭제하려면 unlink() 메소드를 통해 제거 작업을 진행할 수 있습니다.

fs 디렉토리 생성/삭제

fs.mkdir('새폴더', { recursive: true }, (err) => {
  if (err) throw err;
});

fs.rmdir('폴더', (err) => {
  if (err) throw err;
});

디렉토리의 생성은 mkdir() 메소드로, 삭제는 rmdir() 메소드로 가능합니다.

여기서 Node 14 이상 버전에서는 rm() 메소드를 통해서도 옵션에 따라 디렉토리 제거가 가능합니다.

파일/디렉토리 이름 변경

fs.rename('old.txt', 'new.txt', (err) => {
  if (err) throw err;
});

파일이나 디렉토리의 이름을 변경하려면 rename() 메소드를 사용하면 됩니다.

다른 메소드들과 마찬가지로 콜백 함수를 통해 작업 결과를 알 수 있습니다.

파일/디렉토리 복사

fs.cp('원본.txt', '복사본.txt', (err) => {
  if (err) throw err;
});

Node 16 이상 버전에서는 cp() 메소드를 통해 파일이나 디렉토리를 복사할 수 있습니다.

Promise 기반으로 사용

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

async function readFile() {
  try {
    const data = await fs.readFile('test.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

Promise 기반의 fs를 불러와 async/await 구문을 사용할 수도 있습니다.

await 구문을 사용하면 비동기로 작업을 수행하는 readFile() 메소드를 콜백 함수 없이 사용할 수 있습니다.

파일 작업 결과는 리턴 값으로 받고 오류는 try/catch 구문으로 확인합니다.

정리

fs 모듈은 File System에 관련된 작업을 하는 모듈로 파일이나 디렉토리의 읽기, 쓰기, 삭제 등의 작업을 수행할 수 있습니다.

필요에 따라 비동기, 동기 방식을 선택할 수 있고 Promise까지 적용할 수 있습니다.

관련 글

Node.js 튜토리얼