Path Module에 대해 배워보자. 먼저 이 모듈을 사용하기 위해서는 다음과 같이 import해야 한다.
import path from "path"
제일 먼저 basename이라는 메서드는 경로의 제일 마지막 부분을 보여준다.
console.log(path.basename("c:\\nodejs\\index.js"))
//index.js <- get the last portion of the path
console.log(path.basename("c:\\nodejs\\app.js", ".js"));
//app
두 번째 인자에 ".js"를 추가했더니 ".js"가 값에서 빠진 것을 볼 수 있다.
다음으로 dirname은 폴더 이름을 보여준다.
console.log(path.dirname("c:\\nodejs\\courses\\app.js"));
//c:\nodejs\courses
여기서는 폴더가 두 개여서 두 개 다 나왔다.
extname은 파일의 확장자 이름을 보여준다.
console.log(path.extname("c:\\nodejs\\courses\\app.js"));
//.js <- extension name
join은 여러 개의 인자를 받아 경로를 조인해서 합쳐주는 역할을 한다.
console.log(path.join("c:", "yuuka", "courses", "node-js"));
//c:\yuuka\courses\node-js
//GO UP A LEVEL
console.log(path.join("c:", "yuuka", "courses", "node-js",".."));
//c:\yuuka\courses
console.log(path.join("c:", "yuuka", "courses", "node-js", "..",".."));
//c:\yuuka
join의 맨 마지막 인자에 상위 디렉토리로 이동을 의미하는 ".."을 써주면 이동한 곳 뒤는 지워지고 출력된다. 마지막 코드에서는 ".."를 두 번 써줬으므로 "yuuka" 폴더까지 올라가고 그 뒤는 지워진다.
normalize는 경로가 복잡하게 있을 때 그 경로를 보기 쉽게 정리해주는 역할을 한다.
console.log(path.normalize("c:\\\courses\\node.js\\store\\features"));
// c:\courses\node.js\store\features
parse는 경로의 모든 정보를 객체로 반환한다.
console.log(path.parse("c:\\nodejs\\courses\\app.js"));
/*{
root: 'c:\\',
dir: 'c:\\nodejs\\courses',
base: 'app.js',
ext: '.js',
name: 'app'
}
*/
객체이기 때문에 특정한 정보만 얻고 싶으면 이렇게 . 이후에 얻고 싶은 key를 써주면 된다.
console.log(path.parse("c:\\nodejs\\courses\\app.js").base);
//app.js
FS module 파일 시스템을 다루기 위한 기본 모듈이다. 파일 시스템을 다룰 때 코드의 실행방식에 따라 나눌 수 있는데, 이번 포스트에서는 Promise api, Callback api, Sync api로 나누어 정리해 보겠다. Promise api, Callback api 방법은 코드가 비동기일 때 사용할 수 있고 동기일때는 Sync api방법을 사용하면 된다. FS module은 나중에 우리가 애플리케이션에서 파일을 저장하거나 목록 보거나 할 때 유용하게 쓸 수 있다.
먼저 import를 이렇게 해준다.
import * as fs from 'fs/promises';
그리고 promise이기 때문에 async/await를 사용할 수 있으므로 try catch문을 사용한다. node.js import에서는 await를 async가 없어도 위에서 사용할 수 있다는 특징이 있다.
try {
await fs.mkdir('c:\\nodejs\\courses')
console.log('Folder created ...')
} catch (error) {
console.log(error)
}
여기서 fs.mkdir 은 폴더를 만들어주는 메서드이다. ()안에는 폴더를 만들어 주고 싶은 경로를 적어주면 된다. 만약 nodejs라는 폴더가 c에 있는 경우에는 courses라는 폴더가 만들어지지만 그렇지 않을 경우에는 error메세지가 뜨게 된다. 그런데 혹시 nodejs라는 폴더가 아직 생성되지 않았지만 c에 nodejs폴더를 만들고 그 안에 courses폴더를 만드는것을 강제하고 싶을 경우에는
try {
await fs.mkdir('c:\\nodejs\\courses',{rescursive: true})
console.log('Folder created ...')
} catch (error) {
console.log(error)
}
이렇게 {rescursive: true}를 추가해 주면 된다.
컨텐츠를 읽는 메서드는 fs.readdir이다.배열 형태로 c의 nodejs폴더 안에 있는 파일을 보여준다.
try {
const files = await fs.readdir("c:\\nodejs");
for (const file of files) {
console.log(file)
}
} catch (error) {
console.log(error)
}
폴더를 없애주는 메서드는 fs.rmdir이다.
try {
await fs.rmdir("c:\\nodejs\\Courses")
} catch (error) {
console.log(error)
}
위의 코드에서 nodejs안에 있는 Courses 폴더를 없애준다. 참고로 폴더의 안이 비워져 있을 때만 지워지고 안에 파일같은게 있으면 적용되지 않는다.
파일을 생성하고 그 안에 글을 쓰는 메서드는 fs.writeFile이다.
try {
await fs.writeFile('README.md','Hello Nodejs')
} catch (error) {
console.log(error);
}
위의코드에서 'Hello Nodejs' 부분을 다른 걸로 바꾸면 전에 썼던 Hello Nodejs는 사라지고 새롭게 써준걸로 내용이 바뀌게 된다.
파일을 읽는 메서드는 fs.readFile이다.
try {
const data = await fs.readFile('README.md',"utf-8")
console.log(data)//buffer without utf-8
} catch (error) {
console.log(error);
}
"utf-8"를 쓰지 않으면 buffer 값이 나오게 되므로 두번째 인자에 써준것이다.
파일에 데이터를 추가해주고 싶을 때는 fs.appendFile 메서드를 쓴다.
try {
await fs.appendFile('README.md',"Nodejs is the best")
} catch (error) {
console.log(error);
}
이렇게 쓰면 원래 README 파일에 있던 글에 덧붙여져서 두번째 인자가 추가되게 된다.
파일을 카피해주고 싶을 때는 fs.copyFile 메서드를 써준다.
try {
await fs.copyFile('README.md', 'info.txt')
} catch (error) {
console.log(error);
}
위의 코드로 info.txt라는 이름으로 readme 파일이 카피된다.
마지막으로 파일의 정보를 얻고 싶을 때는 fs.stat 메서드를 써준다.객체로 정보들이 나오기 때문에 .을 이용해서 원하는 정보만을 얻을 수도 있다.
try {
const info = await fs.stat("info.txt")
// console.log(info)
console.log(info.isDirectory());//false
console.log(info.isFile());//true
} catch (error) {
console.log(error);
}
코드가 비동기 일때 Callback api도 사용할 수 있는데, 아래 와 같이 fs/promises 이 아닌 fs만 불러오고 try catch가 아닌 throw을 이용한다. 다른 메서드도 아래와 같은 방식으로 쓰면 된다.
import * as fs from 'fs';
fs.mkdir("c:\\nodejs", function (error) {
if (error) throw error;
console.log("Directory Created");
});
코드가 동기적일때는 이런식으로 써준다.
import * as fs from 'fs'
//Create Directory
fs.mkdirSync("c:\\nodejs\\test\\demo", { recursive: true });
//Remove Directory
fs.rmdirSync("c\\nodejs\\test\\demo");