Nodejs – Module (path / file)

Path

const path = require('path');
const { parse } = require('path/posix');

console.log(__dirname); // 포함된 디렉토리 이름 (/Users/minseong/Desktop/git/nodejs/9-path)
console.log(__filename); // 포함된 파일이름 포함 (/Users/minseong/Desktop/git/nodejs/9-path/app.js)

console.log(path.sep); // 각 운영체제별 경로 구분자 출력 (window :\\ , UNIX : /)
console.log(path.delimiter); // 환경변수 구분자

// basename
console.log(path.basename(__filename)); // 파일 이름  출력 (app.js)
console.log(path.basename(__filename, '.js')); // 파일 이름만 출력 (app)


// dirname
console.log(path.dirname(__filename)); // 디렉토리 이름 (/Users/minseong/Desktop/git/nodejs/9-path) 

//extension
console.log(path.extname(__filename)); // 확장자만 (.js)

//parse
const parsed = path.parse(__filename); 
/*
{
  root: '/',
  dir: '/Users/minseong/Desktop/git/nodejs/9-path',
  base: 'app.js',
  ext: '.js',
  name: 'app'
}
*/ 

const str = path.format(parsed);
console.log('str=> ',str); // str=>  /Users/minseong/Desktop/git/nodejs/9-path/app.js

// isAbsolute
console.log('isAbsolute?', path.isAbsolute(__dirname)); // 절대 경로인지 확인
console.log('isAbsolute?',path.isAbsolute('../'));

// normalize
console.log(path.normalize('./folder//////sub')); // 잘못된 경로를 수정해줌

// join
console.log(__dirname + path.sep + 'image'); // os별 대응을 위해 '/' 대신 path.sep 을 씀
console.log(path.join(__dirname,'image')); // 현디렉토리에 image라는 경로 생성

File

const fs = require('fs');
const { deflateSync } = require('zlib');

// 모든 API는 3가지 형태로 제공된다.

// 1. rename (...., callback(error,data))  >> 비동기, 필요한 인자와 콜백함수를 전달하면, 필요한 일을 다 진행한 다음 등록한 콜백함수를 호출해준다.

// 2. try {renameSync(....) } catch(e) { } >> Sync는 따로 콜백함수를 전달하지 않는다. 해당 구문에 에러가 있다면 다음 코드가  실행되지 않으므로(어플리케이션 죽음) 항상 try catch 문으로 감싸야한다. 

// 3. promises.rename().then().catch(0) >> 비동기

//fs.renameSync('./file.txt', './file-new.txt'); // 안좋은 예 : file.txt 파일을 찾을 수 없어, error 로 다음 구문으로 넘어가지않음

try {
    fs.renameSync('./text.txt','./text-new.txt');
} catch (error) {
    console.error(error);
} // try catch구문으로, 에러가 발생했더라도 다음 코드 라인이 실행되도록 해줌



fs.rename('./text-new.txt','./text.txt',(error)=>{console.log(error);});

fs.promises
    .rename('./text2.txt','./text-new.txt')
    .then(()=> console.log('Done')) // 문제가 없을때 동작 입력
    .catch((error)=>{console.log(error);}); // 에러 발생시 동작 입력

파일 시스템 모듈에서 Sync(동기)는 사용하지 않는 것이 좋다. 동작이 끝날때까지 다음줄로 넘어가지 않고, 에러가 발생했을때 아예 노드 어플리케이션이 죽어버리기 때문이다.

비동기식인 callback 으로 전달하던지, promises 형태로 처리하는게 가장 좋다.

const fs = require('fs').promises;
// import * as fs1 from 'fs';

// read a file
fs.readFile('./text.txt','utf-8')
    .then((data)=>{console.log(data)})
    .catch((console.error));


// write a file
fs.writeFile('./text.txt','Hello, world~~!! :) ') //
    .catch(console.error);

// append text to the file
fs.appendFile('./text.txt','Hello, world~~!! :) ')
    .then(()=>{
        fs.copyFile('./text.txt','./text2.txt') // 텍스트가 추가된 다음 카피가 일어나게하기 위해(비동기는 순차적으로 될수도 있고 안될 수도 있기 때문)
        .catch(console.error); 
    })
    .catch(console.error);

// copy
fs.copyFile('./text.txt','./text2.txt') 
    .catch(console.error);


// make a folder
fs.mkdir('sub-folder')
    .catch(console.error);

fs.readdir('./') //현재 경로에 있는 모든 파일을 읽어옴
    .then(console.log)
    .catch(console.error);