포스트

Node.js에서 fs.rename을 사용하여 파일 확장자 변경하기

문제 상황: 확장자가 다른 파일 이름 변경하기

여러분이 Node.js에서 파일을 다룰 때, fs.rename 함수를 사용하여 파일 이름을 변경하려고 할 수 있습니다. 그런데 이때 주의할 점이 하나 있습니다. 바로 파일의 확장자가 달라질 경우에는 어떻게 처리해야 하는가입니다. 이 글에서는 이 문제를 해결하는 방법을 자세히 살펴보겠습니다.

‘fs.rename’의 기본 사용법

Node.js에서 제공하는 fs (File System) 모듈에는 파일을 다루는 다양한 메소드가 있습니다. 그 중 fs.rename은 파일의 이름을 변경하는 역할을 합니다.

기본적인 사용법은 다음과 같습니다.

1
2
3
4
5
6
const fs = require('fs');

fs.rename('oldName.txt', 'newName.txt', (err) => {
  if (err) throw err;
  console.log('Rename complete!');
});

여기서 oldName.txt는 변경하려는 파일의 현재 이름이고, newName.txt는 새로운 이름입니다.

확장자가 다를 때의 문제: ENOTDIR

문제가 발생하는 상황은 이렇습니다. 예를 들어 .txt 파일을 .pdf로 확장자를 바꾸려고 할 때, fs.rename을 단순히 사용하면 에러가 발생합니다. 에러 이름은 ENOTDIR입니다.

이 에러는 ‘Not a directory’ 즉, 지정한 경로가 디렉토리가 아니라는 뜻입니다. 그래서 확장자가 다를 경우에는 좀 더 세심한 처리가 필요합니다.

해결책: path 모듈과 함께 사용하기

이 문제를 해결하기 위해서는 path 모듈을 사용하는 것이 좋습니다. path 모듈을 사용하면 파일의 경로와 이름, 확장자를 쉽게 분리할 수 있습니다.

다음은 해결책의 예입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const fs = require('fs');
const path = require('path');

const oldPath = 'oldName.txt';
const newPath = 'newName.pdf';

fs.rename(oldPath, newPath, (err) => {
  if (err) {
    if (err.code === 'ENOTDIR') {
      const fileName = path.basename(oldPath);
      const newFileName = path.basename(newPath);
      fs.rename(fileName, newFileName, (err) => {
        if (err) throw err;
        console.log('Rename complete with different extension!');
      });
    } else {
      throw err;
    }
  } else {
    console.log('Rename complete!');
  }
});

이 코드에서는 path.basename 함수를 사용하여 파일 이름만 추출한 후, 새로운 확장자로 변경합니다. 이렇게 하면 ENOTDIR 에러 없이 파일의 확장자까지 성공적으로 변경할 수 있습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.