파일 시스템을 이용한 읽기, 쓰기
// 동기
import fs from "fs";
const fileUrl = "./upload/readme.txt";
fs.writeFileSync(fileUrl, "Hello World~");
const data = fs.readFileSync(fileUrl);
console.log(data.toString());
// 비동기
import fs from "fs/promises";
(async () => {
const fileUrl = "./upload/readme.txt";
try {
await fs.writeFile(fileUrl, "Hello World");
const data = await fs.readFile(fileUrl);
console.log(data);
console.log(data.toString());
} catch (error) {
console.log(error);
}
})();
- 읽을 파일의 경로를 지정할 때 기준은 현재 파일의 기준이 아니라 node 명령어를 실행하는 콘솔 기준이라는 점에서 유의해야 합니다.
- async/await을 사용하려면 fs가 아닌 fs/promises를 import 해야 합니다.
스트림 방식으로 파일 읽기, 쓰기
읽기
import fs from "fs";
const fileUrl = "./upload/readme.txt";
const readStream = fs.createReadStream(fileUrl, { highWaterMark: 12 });
const data = [];
readStream.on("data", (chunk) => {
data.push(chunk);
console.log(`data : ${chunk}, ${chunk.length}`);
});
readStream.on("end", () => {
console.log(`end : ${Buffer.concat(data).toString()}`);
});
readStream.on("error", (error) => {
console.log(`error : ${error}`);
});
- readStream이 12Byte 단위로 읽을 때마다 "data" 이벤트에 등록한 콜백 함수가 호출되어 읽은 데이터를 사용할 수 있습니다.
쓰기
import fs from "fs";
const fileUrl = "./upload/readme.txt";
const writeStream = fs.createWriteStream(fileUrl);
writeStream.on("finish", () => {
console.log("파일 쓰기 완료");
});
writeStream.write("Hello ");
writeStream.write("World");
writeStream.end();
- writeStream을 생성하고 .end()가 호출되면 "finish" 이벤트에 등록한 콜백 함수가 호출되어 작업의 종료를 알립니다.
기타 fs 메서드
fs.access
- 폴더나 파일에 접근할 수 있는지를 체크하는 메서드입니다.
fs.mkdir
- 폴더를 만드는 메서드입니다. 이미 폴더가 있다면 에러가 발생하므로 먼저 access 메서드를 호출해서 확인해야 합니다.
fs.open
- 파일의 아이디(fd 편수)를 가져오는 메서드이며 파일에 어떤 작업을 할지 설정할 수 있습니다.
fs.rename
- 파일의 이름 및 경로를 변경하는 메서드입니다.
fs.unlink
- 파일을 지우는 메서드입니다. 파일이 없다면 에러가 발생합니다.
fs.rmdir
- 비어있는 폴더를 지우는 메서드입니다. 폴더가 비어있지 않다면은 에러가 발생합니다.