특정 파일이 존재하는지 확인하기위해 fs.exists() 메소드나 fs.access() 메소드를 사용할 수 있습니다.
이 외에도 다양한 방법으로 파일 존재 여부를 확인할 수 있지만 fs.access() 메소드를 사용하는 것을 권장합니다.
Table of Contents
fs.exists()
fs.exists(path, callback)는 파일 또는 디렉토리의 존재 여부를 확인하는 비동기 함수입니다.
그러나 콜백이 호출되지 않을 수도 있는 문제로 인해 Node.js에서는 사용을 권장하지 않습니다.
fs.exists(path, (exists) => {
if (exists) {
console.log('존재함');
} else {
console.log('존재하지 않음');
}
});
주어진 경로의 파일 또는 디렉토리가 존재하면 콜백 함수의 인수로 true를, 존재하지 않으면 false를 전달합니다.
Node.js 공식 API 문서에서 deprecated 상태를 확인할 수 있습니다.
fs.access()
fs.access()는 파일의 접근 가능 여부(존재 여부, 권한 포함)를 비동기적으로 확인하는 함수입니다.
기본 문법 구문은 다음과 같습니다:
fs.access(path[, mode], callback)
- path: 확인할 파일 경로
- mode (옵셔널): 확인할 권한, 기본값은 fs.constants.F_OK (존재 여부만 확인)
- callback: (err) => {} 에러가 있으면 파일이 없거나 접근 불가 상태
사용 가능한 mode 상수:
- fs.constants.F_OK: 존재 여부만 확인(기본값)
- fs.constants.R_OK: 읽기 권한이 있는지 확인
- fs.constants.W_OK: 쓰기 권한이 있는지 확인
- fs.constants.X_OK: 실행 권한 (유닉스 계열에서만)
fs.access()는 내부적으로 파일 시스템 호출을 통해 지정된 경로에 접근 가능한지 확인합니다.
이는 단순히 존재 여부만 보는 것이 아니라, 현재 Node.js 프로세스의 권한을 기준으로 접근 가능성도 판단합니다.
단적인 예로 파일이 존재한다 하더라도 읽기 권한이 없으면 R_OK 확인에서 실패하게됩니다.
async/await 방식
const fs = require('fs').promises;
async function checkFile() {
try {
await fs.access('./example.txt', fs.constants.F_OK);
console.log('파일이 존재합니다.');
} catch {
console.log('파일이 존재하지 않습니다.');
}
}
checkFile();
다른 fs 메소드와 마찬가지로 fs.access() 메소드 역시 async/await 구문을 함께 사용할 수 있습니다.
예제 1: 파일 존재 여부 확인 (F_OK)
const fs = require('fs');
fs.access('./test.txt', fs.constants.F_OK, (err) => {
if (err) {
console.log('파일이 존재하지 않습니다.');
} else {
console.log('파일이 존재합니다.');
}
});
메소드의 mode 옵션에 fs.constants.F_OK를 전달해 파일이 존재하는지만 확인할 수 있습니다.
콜백 함수에서는 에러가 없다면 파일이 존재한다고 간주할 수 있습니다.
예제 2: 파일 읽기 권한 확인 (R_OK)
const fs = require('fs');
fs.access('./readme.txt', fs.constants.R_OK, (err) => {
if (err) {
console.error('읽기 권한이 없습니다.');
} else {
console.log('읽기 권한이 있습니다.');
}
});
mode 옵션으로 fs.constants.R_OK를 사용하면 파일의 읽기 권한이 있는지 없는지 여부를 확인할 수 있습니다.
이전 예제와 동일하게 콜백 함수에서 에러가 없다면 읽기 권한이 있는 것으로 간주할 수 있습니다.
예제 3: 파일 쓰기 권한 확인 (W_OK
)
const fs = require('fs');
fs.access('./log.txt', fs.constants.W_OK, (err) => {
if (err) {
console.error('쓰기 권한이 없습니다.');
} else {
console.log('쓰기 권한이 있습니다.');
}
});
앞선 예제와 마찬가지로 fs.constants.W_OK로 mode만 바꾸면 파일의 쓰기 권한을 확인할 수 있습니다.
정리
- fs.exists()는 더이상 사용하지 않는게 좋습니다.
- 대신 fs.access() 혹은 fs.promises.access()를 사용하면 파일 존재 여부 + 권한까지 확인 가능합니다.
- 동기 방식은 빠르게 스크립트를 짜거나 CLI 툴에서는 괜찮지만, 서버나 대용량 처리에서는 피하는 것이 좋습니다.
- 실무에선 비동기 방식을 사용하는 것이 성능과 안정성 측면에서 유리합니다.