ABOUT ME

Today
Yesterday
Total
  • 노드 pipe와 스트림 메모리 효율 확인
    노드 2023. 4. 12. 16:06

    스트림 데이터는 chunk로 데이터를 흘려 보내는데 이것이 마치 파이프애 액체가 흘러가는 것 같다~ 라고 해서 pipe라는 말을 쓴다. 스트림끼리 파이프를 연결할 수 있다.

    //pipe.js
    const fs = require('fs');
    
    const readStream = fs.createReadStream('readme3.txt', {highWaterMark: 16});
    const writeStream = fs.createWriteStream('writeme3.txt');
    readStream.pipe(writeStream);
    //writeme3.txt
    저는 조금씩 조금씩 나눠서 전달됩니다. 나눠진 조각을 chunk라고 부릅니다.
    노드 버퍼 노드 스트림 붕권 나락 마신 슈날 나찰 초풍 사자 더퍼

    스트림으로 readme3.txt를 읽는다. 읽을때 16바이트씩 읽게 되고 그 데이터들은 pipe에 의해 writeme3.txt에 그 만큼씩 써지게 된다. 

     

    파일을 압축해서 쓸 수도 있다.

    //gzip.js
    const zlib = require('zlib');
    const fs = require('fs');
    
    const readStream = fs.createReadStream('./readme3.txt', {highWaterMark: 16});
    const zlibStream = zlib.createGzip();
    const writeStream = fs.createWriteStream('./readme3.txt.gz');
    readStream.pipe(zlibStream).pipe(writeStream);

     16 바이트씩 읽으면서 압축이 된다. 

    다양한 pipe끼리 연결을 할 수 있는 것을 확인 할 수 있다. 

    *pipe는 스트림을 지원하는 것끼리만 된다는 것을 명심하자.

     

    access, mkdir, open, rename

    파일 및 폴더 생성, 삭제

     

    //fsCreate.js
    const fs = require('fs');
    
    fs.access('./folder', fs.constants.F_OK | fs.constants.R_OK | fs.constants.W_OK, (err) => {
      if (err) {
        if (err.code === 'ENOENT') {
          console.log('폴더 없음');
          fs.mkdir('./folder', (err) => {
            if (err) {
              throw err;
            }
            console.log('폴더 만들기 성공');
            fs.open('./folder/file.js', 'w', (err, fd) => {
              if (err) {
                throw err;
              }
              console.log('빈 파일 만들기 성공', fd);
              fs.rename('./folder/file.js', './folder/newfile.js', (err) => {
                if (err) {
                  throw err;
                }
                console.log('이름 바꾸기 성공');
              });
            });
          });
        } else {
          throw err;
        }
      } else {
        console.log('이미 폴더 있음');
      }
    });

     

    fs.access(경로, 옵션, 콜백) : 폴더나 파일에 접근할 수 있는지를 체크한다. 두 번째 인자로 상수들을 넣었다. 

    F_OK는 파일 존재 여부, R_OK는 읽기 권한 여부, W_OK는 쓰기 권한 여부를 체크한다.

    파일/폴더나 권한이 없다면 에러가 방상하는데, 파일/폴더가 없을 때의 에러 코드는 ENOENT다. 

     

    fs.mkdir(경로, 콜백) : 폴더를 만드는 메서드. 이미 폴더가 있다면 에러가 발생해서 먼저 access() 메서드를 호출해서 확인하는 작업이 필요하다.

     

    fs.open(경로, 옵션, 콜백) : 파일의 아이디(fd 변수)를 가져오는 메서드. 파일이 없다면 파일을 생성한 뒤 그 아이디를 가져온다. 가져온 아이디를 사용해 fs.read() 나 fs.write()로 읽거나 쓸 수 있다. 

    두 번째 인자로 어떤 동작을 할 것인지 설정할 수 있다. 쓰려면 w, 읽으려면 r, 기존 파일에 추가하려면 a다. 

    위의 코드에서는 w로 설정해서 파일이 없을 때 새로 만들 수 있었다. r이었다면 에러가 발생한다. 

     

    fs.rename(기존 경로, 새 경로, 콜백) : 파일의 이름을 바꾸는 메서드. 기존 파일 위치와 새로운 파일 위치를 적어주면 된다.

    반드시 같은 폴더를 지정할 필요는 없다. 

     

    fs.watch

    파일을 감시하는 방법(변경 사항 발생 시 이벤트 호출)

    //watch.js
    const fs = require('fs');
    
    fs.watch('./target.txt', (eventType, filename) => {
      console.log(eventType, filename);
    });

    target.txt가 바뀔 때마다 이런식으로 출력이 된다.

    '노드' 카테고리의 다른 글

    노드 에러 처리하기  (0) 2023.04.12
    노드 스레드풀과 커스텀 이벤트  (0) 2023.04.12
    노드 버퍼와 스트림 이해하기  (1) 2023.04.12
    노드 파일 시스템 사용하기  (0) 2023.04.12
    노드 child_process  (0) 2023.04.12
Designed by Tistory.