fs 모듈
Reference
readFile() 읽기-비동기
js
// fs는 Node.js에서 기본으로 제공하는 내장 모듈이다.
const fs = require("fs");
// readFile 함수를 사용해 index 문서의 데이터를 읽어올 수 있다.
fs.readFile("./index.txt", "utf8", (err, data) => {
if (err) {
console.log(err);
return;
}
console.log(data);
});
console.log("내가 먼저 출력");
// 내가 먼저 출력
// readFile 읽어오기 작업은 비동기지롱
plaintext
readFile 읽어오기 작업은 비동기지롱
- 첫 번째 인자: 경로(문자열)
- 두 번째 인자: 인코딩 형식 (데이터를 읽는 데 사용할 형식)
- 세 번째 인자: 콜백 함수 (에러/데이터 처리)
- "내가 먼저 출력"이 먼저 실행되는 것으로, 비동기 방식임을 확인할 수 있다.
readFileSync() 읽기-동기
js
const fs = require("fs");
const data = fs.readFileSync("./index.txt", "utf8");
console.log(data);
console.log("내가 나중에 출력");
// readFileSync 읽어오기 작업은 동기지롱
// 내가 나중에 출력
plaintext
readFileSync 읽어오기 작업은 동기지롱
- 파일 크기가 작을 때는 무방하지만, 작업이 무거우면 성능에 지장을 줄 수 있으므로 지양하는 것이 좋다.
- 콜백이 필요 없어 코드가 간단하다.
writeFile() · writeFileSync()
js
const fs = require("fs");
// 동기
fs.writeFileSync("./out-sync.txt", "안녕 난 writeFileSync.");
console.log("동기왔어요");
// 비동기
fs.writeFile("./out-async.txt", "안녕 난 writeFile.", (err) => {
if (err) throw err;
console.log("비동기왔어요");
});
console.log("나는 깍뚜기");
// 동기왔어요
// 나는 깍뚜기
// 비동기왔어요
plaintext
안녕 난 writeFileSync.
plaintext
안녕 난 writeFile.
writeFileSync
: 동기 실행 + 콜백 없음writeFile
: 파일 생성/덮어쓰기 + 콜백- 파일 경로와 저장될 데이터를 인자로 넣어 실행하면 파일이 만들어진다.
- 기존 파일이 있으면 덮어쓴다.
appendFile() · appendFileSync()
파일에 데이터를 이어 붙이는 함수
js
const fs = require("fs");
// 동기
fs.appendFileSync("./out-sync.txt", "\n안녕 난 appendFileSync.");
console.log("동기라네");
// 비동기
fs.appendFile("./out-async.txt", "\n안녕 난 appendFile.", (err) => {
if (err) throw err;
console.log("비동기라네");
});
console.log("나는 깍뚜기");
// 동기라네
// 나는 깍뚜기
// 비동기라네
plaintext
안녕 난 writeFileSync.
안녕 난 appendFileSync.
plaintext
안녕 난 writeFile.
안녕 난 appendFile.
- 기존 파일에 데이터를 이어 붙이는 함수
existsSync() · access()
특정 파일의 존재 유무를 확인하는 기능
js
const fs = require("fs");
// 동기
if (fs.existsSync("out-sync.txt")) {
console.log("동기", "파일이 있어용.");
} else {
console.log("동기", "파일이 없어용.");
}
// 비동기
fs.access("out-async.txt", fs.constants.F_OK, (err) => {
console.log("비동기", err ? "파일이 없어용." : "파일이 있어용.");
});
// 동기 파일이 있어용
// 비동기 파일이 있어용
plaintext
안녕 난 writeFileSync.
안녕 난 appendFileSync.
plaintext
안녕 난 writeFile.
안녕 난 appendFile.
existsSync
: 동기, true/false 반환access
: 비동기, 원래 파일이나 디렉토리에 특정 권한이 있는지 확인하는 함수- 두 번째 인자:
fs.constants.F_OK
를 넣어주면 파일 존재 유무만 확인한다. - 콜백의
err
여부로 판단한다.
- 두 번째 인자:
⚠️ exists()
fs.exists()
함수는 오류 처리 부족으로 Deprecated 되었다고 한다.
js
const fs = require("fs");
// ⚠️ Deprecated
fs.exists("out-async.txt", (exists) => {
console.log(exists ? "File exists." : "File does not exist.");
});
unlinkSync() · unlink()
파일 삭제
js
const fs = require("fs");
// 동기
fs.unlinkSync("out-sync.txt");
console.log("동기 삭제해따잉");
// 비동기
fs.unlink("out-async.txt", (err) => {
if (err) {
console.error("Error deleting file:", err);
return;
}
console.log("비동기 삭제해따잉");
});
// 동기 삭제해따잉
// 비동기 삭제해따잉
plaintext
[삭제 전 내용 예시]
안녕 난 writeFileSync.
안녕 난 appendFileSync.
plaintext
[삭제 전 내용 예시]
안녕 난 writeFile.
안녕 난 appendFile.
- 파일 삭제
- 대상이 없거나 권한이 없으면 오류 발생한다.
path 모듈
전역변수: __dirname · __filename
CommonJS에서만 사용 가능한, 실행중인 문서의 경로 정보 전역 변수
js
console.log(__dirname);
console.log(__filename);
__dirname
: 실행 중인 디렉토리 경로__filename
: 실행 파일 전체 경로
join() · resolve()
js
const path = require("path");
console.log(path.join("files", "hello.txt"));
console.log(path.join("./files", "utils", "../hello.txt"));
// 바깥 폴더를 뜻하는 상대 경로가 있으므로 utils는 경로에 포함되지 않는다.
console.log(path.join(__dirname, "files", "hello.txt"));
console.log(path.resolve("files/hello.txt"));
// files/hello.txt
// files/hello.txt
// /Users/binny/nodejs/files/hello.txt
// (/Users/binny/nodejs)/files/hello.txt → (CWD=현재 작업 디렉토리)에 따라 달라진다.
join()
: 경로 조각을 합쳐 정규화된 경로 문자열 반환resolve()
: 현재 작업 디렉토리 기준으로 절대 경로 생성- 참고:
path.join("./files","utils","../hello.txt")
에서 utils가 빠지는 이유는..
가 한 단계 상위를 가리키기 때문(정규화)
basename() · dirname() · extname()
경로를 해석해 부분적인 정보를 반환하는 함수
js
const path = require("path");
const filePath = path.join(__dirname, "files", "hello.txt");
console.log(path.basename(filePath));
console.log(path.dirname(filePath));
console.log(path.extname(filePath));
// hello.txt
// .../files
// .txt
basename()
: 해당 경로의 마지막에 있는 파일이나 폴더의 이름을 추출해 반환dirname()
: 디렉토리 경로 반환extname()
: 파일의 확장자를 추출해 반환
parse() · format()
경로를 객체로 다룰 때
js
const path = require("path");
const filePath = path.join(__dirname, "files", "hello.txt");
const parsed = path.parse(filePath);
console.log(parsed);
console.log(path.format(parsed));
// {
// root: '/'
// dir: '/Users/binny/nodejs/files'
// base: 'hello.txt'
// ext: '.txt'
// name: 'hello'
// }
// /Users/binny/nodejs/files/hello.txt
parse()
: 문자열을 토대로 해당 경로의 정보를 담은 객체를 반환format()
: parse 함수로 만든 객체를 format 함수에 인자로 넣으면 해당 경로의 문자열로 조합해서 반환한다.
relative()
두 경로 간의 관계를 나타내는 함수
js
const path = require("path");
const from = "/Users/binny/nodejs/hello.txt";
const to = "/Users/binny/javascript/es6";
console.log(path.relative(from, to));
// ../../javascript/es6
from
에서to
로 가는 상대 경로 계산- 두 경로가 같은 드라이브에 위치해야 하고, 같은 기준점에서 시작해야
relative()
함수를 사용할 수 있다.