node.js_file

BABY CAT·2022년 9월 22일
0

node.js

목록 보기
3/18

동기적(Synchronous)
어떤 작업을 요청했을 때 그 작업이 종료될때 까지 기다린 후 다음 작업을 수행하는 방식

비동기적(Asynchronous)
어떤 작업을 요청했을 때 그 작업이 종료될때 까지 기다리지 않고 다른 작업을 하고 있다가, 요청했던 작업이 종료되면 그에 대한 추가 작업을 수행하는 방식

1. path 모듈

ㄱ. __dirname

const path = require("path");  //path 메소드 부르기 
const relPath = "tmp/textfile.txt" //상대경로
console.log(__dirname); // 이프로그램이잇는디렉토리
  	// C:\Workspace\03.BackEnd\01.NodeJS
const absPath = path.join(__dirname, relPath) //절대경로
console.log(absPath)   
	//C:\Workspace\03.BackEnd\01.NodeJS\tmp\textfile.txt 

2. fs 파일시스템 모듈

ㄱ. fs.readFileSync - 비권장 - 동기적(순서o)

//file system 모듈

//파일시스템모듈선언
const fs = require("fs");

//동기적으로 읽는 방법 - 비권장

//encoding 정보를 주지 않으면 binary로 읽음
//cmd에서 실행
const buffer = fs.readFileSync("tmp/textfile.txt");
console.log(buffer)  // ASCII code값
console.log(buffer.toString()) 

// 문자로 읽고 싶으면 인코딩 정보가 필요함
const text = fs.readFileSync("tmp/textfile.txt","utf8");
console.log(text);

//비동기적으로만 가능한 것이 많기 때문에 위 코드는 비권장
readFileSync multi

const fs = require("fs");
//리드파일싱크 - 비권장 - 동기적
let bufA = fs.readFileSync("tmp/a.txt","utf-8");
let bufB = fs.readFileSync("tmp/b.txt","utf-8");
let bufC = fs.readFileSync("tmp/c.txt","utf-8");

console.log(bufA)  //cmd창실행
console.log(bufB) 
console.log(bufC)

A. async.parallel로 readFile을 동기적으로 읽기

파일읽기 2가지

const async = require("async");
const fs = require("fs");
//이런것이잇구나~

// cmd 실행

//순서보장안되는코드  - 비동기적
fs.readFile("./07.File/tmp/a.txt", "utf-8", (err,bufA)=>{
   console.log(bufA);
})
fs.readFile("./07.File/tmp/b.txt", "utf-8", (err,bufB)=>{
   console.log(bufB);
})
fs.readFile("./07.File/tmp/c.txt", "utf-8", (err,bufC)=>{
   console.log(bufC);
})  


// cmd 실행

//abc순서보장o   - 동기적
async.parallel({
   bufA: function(callback){
      fs.readFile("07.File/tmp/a.txt","utf-8",callback);
   },
   bufB: function(callback){
      fs.readFile("07.File/tmp/b.txt","utf-8",callback);
   },
   bufC: function(callback){
      fs.readFile("07.File/tmp/c.txt","utf-8",callback);
   }   

}, (err,result)=>{
   console.log(result.bufA);
   console.log(result.bufB);
   console.log(result.bufC);
});

ㄴ. fs.readFile - 권장 - 비동기적(순서x)

//비동기적 asynchronous 으로 파일읽기 - 권장
const fs = require("fs");
fs.readFile("tmp/textfile.txt","utf-8", (err,data)=>{
   if (err) //에러낫을떄 에러안내문구출력
      console.log("1111",err);
   else  //에러안낫을때 그냥 읽기
      console.log("파일에서읽은데이터:",data);
});
// fs.readFileSync(파일이름) //동기적으로파일읽기-배제
// fs.readFile(파일이름,콜백함수) //비동기적으로파일읽기
readFile multi

//fs모듈변수선언
const fs = require("fs");
//cmd실행
// 비동기적
//이렇게 읽으면 순서 보장이 되지 않는다 abc bca...
fs.readFile("tmp/a.txt", "utf-8", (err,bufA)=>{
   console.log(bufA);
})
fs.readFile("tmp/b.txt", "utf-8", (err,bufB)=>{
   console.log(bufB);
})
fs.readFile("tmp/c.txt", "utf-8", (err,bufC)=>{
   console.log(bufC);
})


// readFile을 동기적으로 쓰는 방법 2가지
// 순서가 보장 되는 방법(동기적) 2가지

// 1
fs.readFile("tmp/a.txt","utf-8",(err,bufA)=>{
   console.log("순서보장법1")
   console.log(bufA)
   fs.readFile("tmp/b.txt", "utf-8", (err,bufB)=>{
      console.log(bufB);
      fs.readFile("tmp/c.txt", "utf-8", (err,bufC)=>{
         console.log(bufC);
      });
   });
});

// 2
//(err,bufA)=>{} 콜백함수
fs.readFile("tmp/a.txt","utf-8",(err,bufA)=>{
   
   fs.readFile("tmp/b.txt", "utf-8", (err,bufB)=>{
      fs.readFile("tmp/c.txt", "utf-8", (err,bufC)=>{
         console.log("순서보장법2")
         console.log(bufA)
         console.log(bufB);
         console.log(bufC);
      });
   });
});

ㄷ. fs.writeFile

A. 대체하는 방식

파일 쓰기
async.txt 파일에 '비동기적으로 파일 쓰기' 라는 텍스트를 
넣는 방법 [ async.txt에 있던 원래 텍스트는 지워진다 ] 

const fs = require('fs');
const buffer = '비동기적으로 파일 쓰기';
fs.writeFile('tmp/async.txt', buffer, error => {
    if (error)
        console.log(error);
});

B. 아래에 추가해서 넣는 방식

async.txt 파일에 "\n어펜드 모드로 동작합니다.\n" 텍스트를
추가하는 방법

const fs = require("fs");
let buffer = "\n어펜드 모드로 동작합니다.\n";

fs.writeFile("tmp/async.txt",buffer,{flag:"a"},err=>{
   if(err)
   console.log(err);
});
//cmd실행하면 txt파일에 글이 아래로 추가로 들어간다

C. 파일이름만 주고 파일을 생성하기

fs.writeFile("mysql.json", JSON.stringify(config), err => {
});  

D. readFile + writeFile 읽고 쓰기(글생성)

// from.txt 파일을 읽어서 to.txt 파일에 쓰는데,
// 첫번째 줄은 1번 반복, 두번째 줄은 2번 반복, ...
const fs = require('fs');

// cmd 실행

fs.readFile('07.File/tmp/from.txt', 'utf8', (err, data) => {         //전체감쌈
    //console.log(data);
    const dataArray = data.split('\n').map(s => s.trim());  // \r 제거    // [ aaa, bbb, ccc]
    let output = '';
    dataArray.forEach((item, index) => {
        line = '';
        for (let i=0; i<index+1; i++) {
            line += item;
        }
        if (index != dataArray.length-1)   // 마지막인덱스가 아니라면 엔터넣기
            output += line + '\n';
        else
            output += line;             // 마지막 줄엔 \n 를 넣지 않는다.
    });
    // 아웃풋형태  (원본 aaa엔터bbb엔터ccc) aaa  엔터 bbbbbb 엔터 cccccc

    fs.writeFile('07.File/tmp/to.txt', output, err => {  // to.txt파일 생성 위에서 
        if (err)
            console.log(err);
    });

});

ㄹ. 파일이름, 파일크기, 파일최종수정시간

fs.readdir
fs.stat
fs.unlink
3가지 함수를 이용한다

A. fs.readdir

const fs = require("fs");
// 디렉토리에 잇는 파일 목록 알아내기

thisfile 경로에 있는 폴더를 " " 에 넣어주면 그 폴더속 파일이름들을 출력한다

fs.readdir("tmp",(err,files)=>{
   console.log(files);
}); 
//cmd창 node thisfile.js 실행

B. fs.stat

파일의 정보 (stat) 알아내기
파일의 크기와 최종수정시간

const fs = require("fs");

" " 에 경로/파일이름 이나 thisfile에 바로 있는 파일이름을
넣으면 파일스탯을 출력한다

fs.stat("tmp/a.txt", (err,stats)=>{
   console.log("스탯사이즈(파일크기)",stats.size);
   console.log("스탯엠타임(최종수정시간)",stats.mtime);
}); 
파일 삭제하기(unlink)

fs.unlink('경로/삭제할파일.txt', err => {
   if (err)
      console.log(err);
});

D. fs.rename

파일 이름 변경(rename)

fs.rename('경로/이름바꿀파일.txt', '경로/새이름.txt', err => {
   if (err)
      console.log(err);
});

E. 파일이름, 파일크기, 파일최종수정시간 출력하기

// 디렉토리에 있는 파일에 대하여 최종 수정시간, 파일의 크기, 파일 이름 표시
fs.readdir('tmp', (err, files) => {  // "tmp" 폴더경로를 지정하고 files를 뽑으면 폴더 속 파일이름들이 뽑힌다
   for (let file of files) {    // for let of 로 배열 속 각 밸류들을 뽑는다 즉 파일 하나씩 뽑기
      fs.stat('tmp/'+file, (err, stats) => {   // file이 파일이름이니까 'tmp/'+file로 경로를 잡아주고 스탯을 뽑고
         console.log(`${stats.mtime}\t${stats.size}\t${file}`); // 수정시간 사이즈 파일이름 순으로 출력한다
      });  // \t 은 탭으로 줄을 맞춰주는 것이다
   }
});

3. readline 모듈

ㄱ. cmd창에서 인풋 받아서 새 글과 글 내용을 쓰는 방법

A. cmd창에서 받은 fnInput을(파일네임인풋) 변수로 쓰는 방법

//사용법  node 이파일이름.js 인풋
const fs = require("fs"); //fs모듈선언
const fnInput = process.argv[2];
// cmd 창에서 node thisfile.js input(임의) 이렇게 실행하면 
console.log(fnInput)
console.log(process.argv[2]) //위와 같은 값
// input 으로 입력한 것이 두번 출력
cmd창에서 받은 fnInput이 fnInput 변수로 저장되었다

ex) cmd창에 node pp.js fnInput(임의) 치면
console.log(process.argv[0])C:\Program Files\nodejs\node.exe
console.log(process.argv[1])C:\Workspace\03.BackEnd\01.NodeJS\07.File\pp.js
console.log(process.argv[2]) 은  fnInput

B. 새 파일 생성

fnInput을 변수로 받았으니 이것을 활용하여 fnInput을 파일이름으로 하는 파일을 생성할 수 있다
// readline
// prompt, on('line') 활용
const fs = require("fs"); //fs모듈선언
const readline = require("readline"); //readline 모듈선언

const r1 = readline.createInterface({
	input: process.stdin, //standard input, terminal 키보드로입력한값이스탠다드인풋
	output: process.stdout  //standard output . terminal(monitor) 시엠디창이모니터
});

r1.prompt(">"); //두번째인풋창에 >를 표시해준다

//input은 fsInput파일에 적을 글을 cmd창 인풋으로 받은 글
//err=>는콜백함수
r1.on("line",input =>{
   fs.writeFile(fsInput,input,err=>{
      if(err)
         console.log(err);
   });
   r1.close();
})

cmd에서  node thisfile.js fsInput(이것이파일네임으로) 치면
다음줄에 > 인풋을 받는 줄이 생긴다 여기에 fsInput파일에 들어갈 내용을 적으면
실행 후 thisfile과 같은 폴더에 파일이름이 fsInput인 글이 생성된다
(같은 이름으로 자꾸 실행하면 기존 파일에 덮어쓰면서 기존 글이 지워진다)

C. 새 파일 생성 - 내용을 여러줄로 받는 방법

//사용법  node thisfile.js filename

const fs = require("fs");
const readline = require("readline");

// filename  파라미터로 받기
if (process.argv.length<3){
   console.log("사용법  node thisfile.js filename");
   process.exit(); //프로그램멈추기
}
const filename=process.argv[2];
//argv는  node thisfile.js filename

const r1 = readline.createInterface({
	input: process.stdin, //standard input, terminal 키보드로입력한값이스탠다드인풋
	output: process.stdout  //standard output . terminal(monitor) 시엠디창이모니터
});

r1.setPrompt(">");  //인풋 받는 라인의 안내문을 여기에 직접 선언한 것 

r1.prompt();  // cmd창에서 인풋을 받겠다는 코드

//버프가 받은 글
//err=>는콜백함수
let input = "";
r1.on("line",buf=>{        //엔터키를치면 라인이벤트가 발생
   input += buf + "\n";         
   r1.prompt();
}).on("close", ()=>{           //다끝나서 컨트롤디가 오면 클로스이벤트가 발생
                          //컨트롤디 ;시엠디창 명령중지
   fs.writeFile(filename,input,err=>{
      if(err)
         console.log(err);
   });
   r1.close();
});

//cmd에서  node thisfile.js filename 로
//실행 후 글 적으면 tmp폴더에 새파일로 생성

0개의 댓글