데이터 노가다 일지
파일 관리하기 - path, File System 모듈 본문
파일의 경로는 절대 경로와 상대 경로로 나타낸다.
절대 경로 : 파일이나 폴더의 위치를 루트(root) 폴더부터 시작해서 파일까지 전부 다 나타내는 방식
\Users\funnycom\Desktop\basic\03\example.txt
상대 경로 : 기준이 되는 파일이 있을 때 사용하는 경로
예를 들어 직접 만든 모듈을 가져와서 사용할 경우 현재 파일을 기준으로 모듈이 어느 위치에 있는지 지정할 때 사용
import hello from “./hello.js”;
Path module
.join
- 여러 조각으로 나눠서 입력한 경로를 연결해 하나로 만든다.
.dirname
- 경로에서 파일 이름을 제외한 경로만 추출한다.
.basename
- 경로에서 파일 이름만 추출
- 파일 확장자를 제외한 이름만 추출 하려면 basename 함수에서 확장자를 지정한다.
- path.basename(경로, 확장자)
.extname
- 파일의 확장자만 추출
다음 코드는 extname 함수를 이용해서 확장자를 알아낸 후 basename 함수를 사용해서 황장자 부분을 제외하고 파일 이름을 추출한다.
const path = require("path");
// 생략
const ext = path.extname(__filename);
console.log(`file extend : ${ext}`);
console.loh(path.basename(__filename, ext));
.parse
- 경로를 분석하여 정보를 각각 객체로 반환한다. (파일 경로와 파일 이름, 확장자 등의 정보를 객체로 변환)
const path = require("path");
//
const parsePath = path.parse(__filename);
console.log(parsePath);
03-2 | FS모듈
FS : File System
- 파일과 디렉터리 살펴보기, 새로운 파일과 디렉터리 만들기, 파일 스트리밍 등 파일과 디렉터리를 사용하면서 필요한 여러 기능을 제공한다.
.디렉터리
- 윈도우의 폴더와 같다.
- directory = dir
FS 모듈 가져오기
const fs = require("fs");
fs.함수명
동기 처리로 디렉터리 일기 — readdirSync 함수
- 지정한 경로를 읽어서 그 경로에 있는 파일 이름을 모두 표시한다.
fs.readdirSync(경로[, 옵션])
- 경로 : 파일 목록을 표시할 경로를 지정.
- 옵션 : readdirSytnc 함수에서 사용하는 옵션은 encodding이다. 기본값 : utf8
비동기 처리로 디렉터리 일기 — readdir 함수
- 지정한 경로의 디렉터리를 읽고, 거기에 있는 파일 이름을 모두 표시한다.
fs.readdir(경로 [, 옵션], 콜백)
- 경로 : 파일 목록을 표시할 경로를 지정한다.
- 옵션 : encodding, withFileTypes
- encodding : defualt value ‘TRUE’
- withFileTypes : 기본값은 FALSE, TRUE 로 지정하면 문자열로 된 배열이 아니라 디렉터리 항목으로 된 배열을 반환한다.
- readdir : 함수에서 콜백을 처리할 떄는 err와 files 매개변수를 사용한다.
const fs = require("fs")
fs.readdir("./", (err, files) => {
ir (err) {
console.error(err);
}
console.log(files);
});
03-3 | 파일 관리하기
동기 처리로 파일 읽기 — readFileSync 함수
- 동기 처리로 파일을 읽을 때는 위 함수를 사용. 위 함수는 파일 내용을 버퍼 또는 문자열 형태로 반환함.
- 버퍼(Buffer)는 잠시 자료를 저장해 두는 임시 메모리 영역임,
비동기 처리로 파일 읽기 — readFile 함수
- 이 함수는 파일의 내용을 버퍼, 또는 문자열로 반환한다.
const fs = require("fs");
fs.readFile("./example.txt", "utf8", (err, data) => {
if(err) {
console.error(err);
}
console.log(data);
});›
동기 처리로 파일에 쓰기 — wtireFileSync 함수
fs.writeFileSync(파일, 내용[, 옵션])
- 파일 : 내용을 기록할 파일을 지정
- 내용 : 기록할 내용을 지정
- 옵션 : encodding(utf8), flag(w), mode
- mode : 파일에 사용자의 권한을 설정한다. 8진수 형태의 숫자를 사용할 수도 있고, 알파벳과 문자로 된 문자열을 지정할 수도 있다. 기본값은 0o666(읽고, 쓰기 권한)이다.
const fs = require("fs");
const data = fs.readFileSync("./example.txt","utf8");
fs.wrteFileSync("./text-1.txt", data);
//text-1.txt 파일이 없던 상태에서 위 코드를 실행하면 writeFileSync 함수를 사용해
//현재 폴더에 text-1.txt 파일이 만들어지면서 example.txt 파일의 내용이 기록된다
파일 존재 여부 체크하기 — existsSync 함수
- ~~exists~~
- 파일 존재 여부를 체크하는 비동기 함수인 exists는 더 이상 사용하지 않기 떄문에 비동기에서도 existsSync 함수를 사용한다
- 파일이 존재하면 TURE, 존재하지 않으면 FALSE를 반환한다.
const fs = require('fs');
const data = fs.readFileSync("example.txt","utf8");
if (fs.existsSync("text-1.txt")) { // text-1.txt. 파일이 있다면
console.log("file alteady exist!!");
} else { // text-1.txt 파일이 없다면
fs.writeFileSync("text-1.txt", data);
}
비동기 처리로 파일에 쓰기 — writeFIle 함수
f.swriteFile(파일, 내용[, 옵션], 콜백)
- 파일 : 내용을 기록할 파일을 지정
- 내용 : 기록할 내용을 지정
- 옵션 : encodding, mode, flag, signal
- encodding (utf8)
- mode : 파일에 대한 권한 지정
- flag : 기본값은 w. 기존 파일에 내용을 추가한다면 a 를 사용.
- signal : 파일에 내용을 기록할 때 시간이 너무 걸리 경우 signal 옵션을 사용하여 중간에 파일 쓰기를 취소할 수 있다.
- 콜백 : writeFile 함수에서 콜백을 사용할 때 err 매개변수를 사용한다.
const fs = requier("fs");
fs.readFile("./exmaple.txt","utf8", (err, data) => {
if (err) {
console.error(err);
}
fs.writeFile("./text-2.txt", data, (err) => {
if (err) {
console.log(err);
}
console.log("text-2.txt is saved!");
});
});
기존 파일에 내용 추가하기 — flag 옵션 사용하기
writeFileSync 함수나 writeFile 함수에서 파일 이름을 지정할 때 이미 존재하는 파일일 경우에는 기존 내용을 삭제하고 새로운 내용을 추가해 버립니다. 의도한 것이라면 상관없지만 만일 기존 내용을 그대로 유지하면서 새로운 내용을 추가해야 한다면 flag 옵션을 지정할수 있습니다. 자주 사용하는 flag 값은 다음과 같습니다.
다음 코드는 text-1.txt 파일에 새로운 내용을 추가한다.
const fs = require('fs');
let content = `
================
새로운 내용 추가.
================
`;
fs.writeFileSync("./text-1.txt",content,{flag:"a"});
기존 파일에 내용 추가하기 — appendFileSync, appendFile 함수
기존 파일에 내용을 추가할 때 flag 옵션을 사용하지 않고 위 함수를 사용할 수도 있다.
fs,appendFileSync(파일, 내용[, 옵션])
fs.appendFile(파일, 내용[, 옵션], 콜백)
- 파일 : 내용을 기록할 파일 지정
- 내용 : 기록할 내용을 지정
- 옵션 : encodding, mode, flag
- encodding : 기본값 utf8
- mode : 파일에 대한 퍼미션을 지정함
- flag : 기본값 w. 기존 파일에 내용을 추가한다면 a를 사용
- 콜백 : appendFIle 함수의 콜백은 err를 매개변수로 사용.
const fs = require('fs');
fs.appendFIle("./text-2.txt", "\\n\\n add new content", (err) => {
if (err){
console.log(err);
}
console.log("appending to file");
});
파일 삭제하기 - unlinkSync 함수, unlink 함수
fs.unlinkSync(파일)
fs.unlink(파일, 콜백)
- 파일 : 삭제할 파일을 지정
- 콜백 : unlink 함수에서 콜백을 처리할 때는 매개변수가 없다.
동기 처리로 파일 삭제하기 — unlinkSync 함수
const fs = require('fs');
fs.unlinkSync("./text-1.txt");
console.log("file deleted!!");
파일이 존재하지 않는채로 삭제를 하면 오류가 발생하므로 존재하는지 확인 후 삭제해야한다.
const fs = require('fs');
if(!fs.existsSync("./text-1.txt")) { // 파일이 없다면
console.log("file dose not exist");
} else {
fs.unlinkSync("./text-1.txt");
console.log("file deleted!!");
}
}
비동기 처리로 파일 삭제하기 — unlink 함수
앞에서 살펴본 readdir 함수나 writeFIle 함수에서는 콜백 함수에서 (err, data) ⇒ { … 처럼 err와 data라는 매개변수를 사용했지만 unlink의 콜백 함수엔느 매개변수가 없어서 아래와 같이 사용한다.
const fs = require('fs');
if(!fs.existsSync("./text-2.txt"); { //파일이 없다면
console.log("file donst not exist!!");
} else {
fs.unlink("./text-2.txt", () => {
console.log("file deleted!!");
});
}
03-4 | Management directory
디렉터리 만들기 — mkdirSync, mkdir 함수
fs.mkdirSync( 경로[, 옵션])
fs.mkdir( 경로[, 옵션], 콜백)
- 경로 : 새로 만들 디렉터리 경로를 지정
- 옵션 : recursive, mode
- recursive : 여러 계층의 디렉터리를 지정했을 때 중간에 존재하지 않는 경로까지 포함해서 디렉터리를 만들 수 있다. 기본값은 FALSE다.
- mode : 디렉터리의 권한을 지정한다. 기본값은0o777(읽기, 쓰기, 실행 권한) 이다.
const fs = require("fs");
if (fs.existsSync("./text")) { // 디렉터리가 있다면
console.log("folrder alreadt exist!");
} else {
fs.mkdir("./test", (err) => {
if (err) {
console.error(err);
}
console.log("folder created!");
});
}
한번에 여러 디렉터리를 만드는 방법은 아래의 코드와 같다.
fs = require("fs");
if(fs.existsSync(" ./test2/test3/test4")) { // 디렉터리가 있다면
console.log("folder already exist!");
} else {
fs.mkdir("./test2/test3/test4", { recursive : ture }, (err) => {
if(err) {
console.error(err);
}
console.log("folder created!");
});
}
빈 디렉터리 삭제하기 rmdirSync, rmdir 함수
fs.rmdirSync(경로, 내용[, 옵션])
fs.rmdir(경로[, 옵션], 콜백 )
- 경로 : 삭제할 디렉터리 경로를 지정
- 옵션 : maxRetries, retryDelay
- 콜백 : rmdir 함수에서 콜백 형태는 err 매개변수를 사용한다.
- maxRetries : 오류가 발생해서 디렉터리를 삭제하지 못했을 때 재시도할 횟수를 지정한다. 기본값은 0 이다.
- retryDelay : 재시도 횟수를 지정했을 경우 대기 시간(밀리초)을 정할 수 있다. 기본값은 100이다.
const fs = require("fs");
if (fs.exisysSync("./text")) { // 삭제할 디렉터리가 있다면
fs.rmdir("./test", (err) => {
if (err) {
console.error(err);
} else {
console.log("folder deleted!!");
}
});
} else { // 삭제할 디렉터리가 없다면
console.log("folder does not exist!");
}
파일 삭제 및 내용이 있는 디렉터리 삭제하기 — rmSync, rm 함수
아래 함수는 파일에 내용이 있어도 삭제가 가능하다.
fs.rmSync(경로, 내용[, 옵션])
fs.rm(경로[, 옵션], 콜백)
- 경로 : 삭제할 디렉터리 경로나 파일을 지정
- 옵션 : force, maxRetries, retryDelay, recursive
- 콜백 : rm 함수에서 콜백 형태는 err 매개변수를 사용함.
force : TRUE로 지정하면 파일이나 디렉터리를 강제로 삭제함. 삭제할 파일이나 디렉터리가 없어도 오류 발생하지 않음 기본값은 FALSE
recursive : 경로가 여러 단계라면 단계별로 삭제 작업을 실행. 기본값은 FALSE
const fs = require('fs');
fs.rm("./test2". { recursive : ture), (err) => {
if(err) {
console.error(err);
} else {
console.log("folder deleted!");
}
});
03-5 | Understand about buffer and stream
버퍼와 스트림은 파읽을 읽거나 쓸 때 한 덩어리로 처리하지 않고 작은 단위로 나눠서 시간을 절약하는 방법이다.
버퍼
컴퓨터 공학에서 버퍼는 임시 데이터를 저장하는 물리적인 메모리 공간이다.
파일을 읽어 올 때 전체 내용을 한꺼번에 다 가져오지는 않는다. 한번에 버퍼 하나 크기 만큼만 가져오고, 버퍼가 가득하면 그 내용을 전달해 준다고 이해하자.
const fs = require('fs');
fs.readFile("example.txt", (err, data) => {
if (err) {
console.log(err);
} else {
console.log(data); // 이진 데이터 표시
console.log("\\n");
console.log(data,toString()); // 문자열로 변환해서 표시
}
});
스트림
사용자가 화면을 보는 동안 또 다른 파일이 버퍼에 다운로드되고 버퍼가 가득 차면 다시 화면에 재생된다. 이런 서비스를 스트리밍(Streaming)서비스 라고 한다.
리더블 스트림
- readable stream은 데이터를 읽기 위한 스트림을 주로 서버에서 용량이 큰 데이터를 가져올 때 많이 사용한다. 이 함수는 데이터를 작은 크기로 나누어서 읽어 온다.
fs.createReadStream( 경로, 내용[, 옵션])
- 경로 : 리더블 스트림을 읽어 올 파일을 지정
- 옵션 : flag. encodding, fd, mode, autoClose, start,end
- flag : 기본값은 f
- fd : 파일을 여는 작업을 생략함. 기본값은 null
- autoClose : 읽기가 끝난 후 파일을 자동으로 닫을지 지정 기본값은 ture
- start : 파일을 어디서부터 읽을지 지정 기본값은 0
- end : 파일을 어디까지 읽을지 지정 기본값은 infinity
자바스크립트는 이벤트 기반(event-driven) 언어이다.
이벤트가 발생했을 때 그 이벤트를 처리하는 방식으로 프로그래밍하기 때문이다. 아래는 리더블 스트림에서 사용할 수 있는 주요 이벤트 이다.
노드에서 이벤트 처리 하는 방법
on("이벤트", 콜백)
const fs = require('fs');
const readStream = fs.createReadStream('./readMe.txt');
readStream.on('data', (chuk) => {
console.log('new chuck received!');
console.log('chuck');
});
readStream.on('end', () => {
console.log('finished reading data');
});
readStream.on("error", (err) => {
console.log(`Error reading the file : ${err}`);
});
라이터블 스트림
데이터를 기록하는 스트림이다.
fs.createWriteStream(경로, 내용[, 옵션])
- 경로 : 라이터블 스트림을 사용해 기록할 파일을 지정
- 옵션 : flag, encodding, fs, mode, autoClose, start
- fd : 파일을 여는 작업을 생략 기본값 null
- autoClose : 파일 쓰기가 끝난 후 자동으로 닫을지 지정 기본갑 true
- start : 파일을 어디서부터 기록할지 지정 기본갑 0
const fs = require('fs');
const readStream = fs.createReadStream("./readMe.txt", "utf8");
const writedStream = fs.createWriteStream("./writeMe.txt");
readStream.on("data", (chuck) => {
console.log('new chuck received!');
writeSteam.write(chuck);
});
위 코드를 실행하면 writeMe.txt가 만들어져 readMe.txt의 내용을 그대로 옮겨 준다. 하지만 4번에 걸쳐 기록을 가져온다.
2개의 스트림을 연결하는 파이프 — pipe
data 이벤트가 발생했을때 따로 가져오고 기록하던 것을 한번에 처리할 수 있다.
fs.readStream.pipe(writeStream [, 옵션])
pip 함수는 다음 방식으로 동작한다.
- 리더블 스트림에서 데이터를 읽는다.
- 읽은 데이터를 라이터블 스트림으로 기록한다.
- 라이터블 스트림에 다 기록할 때까지 리더블 스트림에서 읽고 쓰기를 반복한다.
- 리더블 스트림에서 더 이상 데이터가 없거나, 라이터블 스트림에 쓸 데이터가 없으면 pipe 함수가 자동 종료된다.
//pipe 함수를 사용하지 않았을 때
fs.readStream.on('data', (chunk) => {
fs.writeStream.write(chunk);
});
//pipe 함수를 사용했을 때
fs.readStream.pipe(writeStream);
'Node.js, js' 카테고리의 다른 글
자바스크립트 기초 문법 (0) | 2024.10.07 |
---|