동기적(Synchronous)
어떤 작업을 요청했을 때 그 작업이 종료될때 까지 기다린 후 다음 작업을 수행하는 방식
비동기적(Asynchronous)
어떤 작업을 요청했을 때 그 작업이 종료될때 까지 기다리지 않고 다른 작업을 하고 있다가, 요청했던 작업이 종료되면 그에 대한 추가 작업을 수행하는 방식
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
//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)
파일읽기 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);
});
//비동기적 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);
});
});
});
파일 쓰기
async.txt 파일에 '비동기적으로 파일 쓰기' 라는 텍스트를
넣는 방법 [ async.txt에 있던 원래 텍스트는 지워진다 ]
const fs = require('fs');
const buffer = '비동기적으로 파일 쓰기';
fs.writeFile('tmp/async.txt', buffer, error => {
if (error)
console.log(error);
});
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파일에 글이 아래로 추가로 들어간다
fs.writeFile("mysql.json", JSON.stringify(config), err => {
});
// 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가지 함수를 이용한다
const fs = require("fs");
// 디렉토리에 잇는 파일 목록 알아내기
thisfile 경로에 있는 폴더를 " " 에 넣어주면 그 폴더속 파일이름들을 출력한다
fs.readdir("tmp",(err,files)=>{
console.log(files);
});
//cmd창 node thisfile.js 실행
파일의 정보 (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);
});
파일 이름 변경(rename)
fs.rename('경로/이름바꿀파일.txt', '경로/새이름.txt', err => {
if (err)
console.log(err);
});
// 디렉토리에 있는 파일에 대하여 최종 수정시간, 파일의 크기, 파일 이름 표시
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 은 탭으로 줄을 맞춰주는 것이다
}
});
//사용법 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
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인 글이 생성된다
(같은 이름으로 자꾸 실행하면 기존 파일에 덮어쓰면서 기존 글이 지워진다)
//사용법 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폴더에 새파일로 생성