본문 바로가기
전공수업/Node.js

[Node.js] 파일 시스템

by JooRi 2024. 4. 30.
728x90
SMALL

* fs 

파일 시스템에 접근하는 모듈이다.

fs 모듈로  파일 및 폴더 생성/삭제/읽기/쓰기 모두 가능하다.

 

<파일 생성 예제>

const fs = require('fs');  // fs 모듈 불러옴

// fs.writeFile(file, data, options, callback)로 파일 쓰기
fs.writeFile('./writeme.txt', '글이 입력됩니다.', (err) => {
    if(err){  // 오류 발생 시 처리
        throw err;
    }
    // fs.readFile(file, options, callback)로 파일 읽기
    fs.readFile('./writeme.txt', (err, data) => {
        if (err) {  // 오류 발생 시 처리
            throw err;
        }
        console.log(data.toString());  // 읽은 데이터를 콘솔에 출력합
    });
});

 

생성된 파일

위 코드를 실행하면 '글이 입력됩니다.'라는 내용의 writeme.txt 파일이 생성되며, 콘솔에는 파일 내용이 출력된다.

 

* 버퍼

버퍼는 일정한 크기로 데이터를 모아두는 것으로, 일정한 크기가 되면 한 번에 처리한다.

노드에서는 buffer 객체를 사용한다.

 

버퍼 메서드

- Buffer.from(문자열): 문자열을 바이트로 인코딩하여 버퍼 생성(버퍼로 변환)

- Buffer.toString(버퍼): 버퍼를 다시 문자열로 디코딩

- Buffer.concat(배열): 배열 안에 든 여러 개의 버퍼를 하나로 합침

- Buffer.alloc(바이트): 빈 버퍼 생성

 

<버퍼 메서드 사용 예제>

const buffer = Buffer.from('abcde\n');  // 문자열 인코딩하여 버퍼 생성
console.log('from():', buffer);  // 생성된 버퍼 출력
console.log('length:', buffer.length);  // 버퍼 크기 출력(바이트 단위)
console.log('toString():', buffer.toString());  // 디코딩하여 출력

// 배열에 있는 여러 버퍼를 합쳐서 하나의 버퍼로 만듦
const array = [Buffer.from('띄엄 '), Buffer.from('띄엄 '), Buffer.from('띄어쓰기')];
const buffer2 = Buffer.concat(array);
console.log('concat():', buffer2.toString());  // 출력

const buffer3 = Buffer.alloc(5);  // 5바이트 크기의 빈 버퍼 생성
console.log('alloc():', buffer3);  // 생성된 빈 버퍼 출력

 

출력 결과

 

* Stream 스트림

스트림은 데이터의 흐름이다. 데이터를 일정한 크기로 나눠서 여러 번에 걸쳐서 처리한다.

 

fs.createReadStream(경로, 버퍼 크기) - 파일 읽기

const fs = require('fs');  // 파일 시스템 모듈 불러옴

// 파일을 읽는 스트림 생성, highWaterMark 옵션은 한번에 읽을 최대 바이트수
const readStream = fs.createReadStream('./readme3.txt', { highWaterMark: 16 });  
const data = [];  // 읽은 데이터를 저장할 배열 선언

// 'data' 이벤트는 스트림에서 데이터가 읽혀질 때 발생
readStream.on('data', (chunk) => {
  data.push(chunk);  // 읽은 데이터를 배열에 추가
  console.log('data :', chunk, chunk.length);  // 읽은 데이터와 데이터의 길이 출력
});

// 'end' 이벤트는 스트림에서 데이터 읽기가 완료됐을 때 발생
readStream.on('end', () => {
  console.log('end :', Buffer.concat(data).toString());  // 데이터를 모두 합쳐서 문자열로 변환하고 출력
});

// 오류 발생 시 처리
readStream.on('error', (err) => {
  console.log('error :', err);
});

 

- readStream.on

data(chunk 전달), end(전달 완료), error(에러 발생) 이벤트 리스너와 같이 사용

 

출력 결과

 

fs.createWriteStream(파일 경로) - 파일 쓰기

const fs = require('fs');  // 파일 시스템 모듈을 불러옴
const writeStream = fs.createWriteStream('./writeme2.txt');  // 쓰기 스트림을 생성(writeme2.txt에 쓰기)

// 'finish' 이벤트는 스트림에서 모든 데이터가 쓰여진 후 발생
writeStream.on('finish', () => {
  console.log('파일 쓰기 완료');
});

// 파일에 데이터 쓰기
writeStream.write('이 글을 씁니다.\n');
writeStream.write('한 번 더 씁니다.');

writeStream.end();  // 파일 쓰기 종료

 

write로 chunk를 입력하고, end로 스트림을 종료한다.

 

파일 생성 완료

 

* 기타 fs 메서드

fs.access(경로, 옵션, 콜백)

폴더나 파일에 접근할 수 있는지를 체크, 옵션은 권한 여부(읽기/쓰기)

 

fs.mkdir(경로, 콜백)

폴더 생성, 이미 폴더가 있다면 에러가 발생하므로 fs.access()로 먼저 확인 필요

 

fs.open(경로, 옵션, 콜백)

파일의 아이디를 가져오는 메서드, 옵션은 동작 설정(w/r/a)

 

fs.rename(기존 경로, 새 경로, 콜백)

파일명 변경

 

fs.readdir(경로, 콜백)

폴더 안의 내용 확인

 

fs.unlink(경로, 콜백)

파일 삭제, 파일이 없다면 에러가 발생하므로, 파일이 존재하는지 먼저 확인 필요

 

fs.rmdir(경로, 콜백)

폴더 삭제, 폴더 안에 파일이 있으면 에러가 발생하므로, 파일을 모두 지우고 호출해야 한다.

 

 

728x90
LIST

댓글