바르고 뜨겁게

[NodeJS] FS(파일시스템) 모듈 - 동기와 비동기 본문

자바스크립트/Node Js

[NodeJS] FS(파일시스템) 모듈 - 동기와 비동기

RightHot 2018. 12. 27. 00:05

FS(파일시스템) 모듈 - 동기와 비동기

노드는 파일시스템에 접근이 가능하다.

const fs = require('fs');

// 파일 읽기
fs.readFile('./readme.txt', (err,data)=>{
   if (err){
       throw err;
  }
   console.log(data); // 버퍼형태
   console.log(data.toString());
});


// 파일 쓰기
fs.writeFile('./writefile.txt', '노드로 생성된 파일입니다.', (err)=>{
   if(err){
       throw err;
  }
   fs.readFile('./writefile.txt', (err,data)=>{
       if (err){
           throw err;
      }
       console.log(data.toString());
  });
})

// 동기 형태로 사용가능하다. - (블록킹)
// let data = fs.readFileSync('./readme.text');

<Buffer eb a6 ac eb 93 9c eb af b8 20 ed 85 8d ec 8a a4 ed 8a b8 20 ed 8c 8c ec 9d bc ec 9e 85 eb 8b 88 eb 8b a4 2e>
리드미 텍스트 파일입니다.
노드로 생성된 파일입니다.

버퍼와 스트림

  • 버퍼란? : 용량이 큰 데이터를 전송할때 한번에 전송을 못하니 특정 단위 만큼 묶어서 전송한다. 그때 BUFFER의 크기만큼 BUFFER에 담아서 전송한다.

  • 스트림이란? : 다 찬 버퍼를 전송하는 것

파일 읽기

const fs = require('fs');

// highWaterMark 바이트 만큼 읽음
const readStream = fs.createReadStream('./bufferTest.txt', { highWaterMark: 16 });
const data = [];

readStream.on('data', (chunk)=>{
   data.push(chunk);
   console.log('data : ', chunk.toString());
   console.log(' ===> highWaterMark 크기: ', chunk.length);
});

readStream.on('end', ()=>{
   console.log('-----------')
   console.log('end', Buffer.concat(data).toString());
});

data :  버퍼 테스트
 ===> highWaterMark 크기:  16
data :  용 텍스트 �
 ===> highWaterMark 크기:  16
data :  �서입니다.

 ===> highWaterMark 크기:  16
data :  나눠진 조각
 ===> highWaterMark 크기:  16
data :  은 chunk 라고
 ===> highWaterMark 크기:  16
data :   합니다.
 ===> highWaterMark 크기:  11
-----------
end 버퍼 테스트용 텍스트 문서입니다.
나눠진 조각은 chunk 라고 합니다.

파일 쓰기

const fs = require('fs');

const writeStream = fs.createWriteStream('./writeStream.txt');
writeStream.on('finish', ()=>{
   console.log('파일 쓰기 완료');
});

writeStream.write('내용 작성 111111 \n');
writeStream.write('내용 작성 2222222222');
writeStream.write('내용 작성 4444444444');
writeStream.end();

파이프

스트림은 버퍼의 흐름이기때문에 여러개의 스트림을 이어서 버퍼가 흘러가게 할 수 있다.

const fs = require('fs');

const readStream = fs.createReadStream('pipeTestRead.txt');
const writeStream = fs.createWriteStream('pipeTestWrite.txt');

// 복사와 유사 pipeTestRead.txt 를 읽어서 pipeTestWrite.txt 쓴다.
readStream.pipe(writeStream);


// 위와 같은 동작, 다른방식
const readStream2 = fs.copyFile('pipeTestRead.txt', 'pipeTestWrite.txt', (err)=>{
   console.log(err);
});

폴더 생성 - 파일 생성 - 파일 이름 변경

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('폴더 만들기 성공 - w: 파일열어보고 없으면 생성 / r: 파일읽기 / a:기존파일에 추가쓰기');
               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('이미 폴더 존재')
  }
})

PS D:\포트폴리오\_Study\Inflearn_nodeJS-Textbook> node createFolder
폴더 없음 - 폴더생성
폴더 만들기 성공 - w: 파일열어보고 없으면 생성 / r: 파일읽기 / a:기존파일에 추가쓰기
빈 파일 만들기 성공 3
이름 바꾸기 성공
PS D:\포트폴리오\_Study\Inflearn_nodeJS-Textbook> node createFolder
이미 폴더 존재

폴더 삭제

const fs = require('fs');

fs.readdir('./folder', (err, dir)=>{
   if(err){
       throw err;
  }
   console.log('폴더 내용 확인',dir);

   // 파일삭제
   fs.unlink('./folder/newFile.js',(err)=>{
       if(err){
           throw err;
      }
       console.log('파일 삭제 성공');

       // 폴더 삭제
       fs.rmdir('./folder',(err)=>{
           if(err){
               throw err;
          }
           console.log('폴더 삭제 성공')
      })
  })
})

폴더 내용 확인 [ 'newFile.js' ]
파일 삭제 성공
폴더 삭제 성공


Comments