프론트엔드-코드/Node.js

파일 fs

sdafdq 2023. 10. 11. 14:22
const fs = require('fs');
const path = require('path');

const FILE_PATH = path.join(__dirname, "addFolder", "addFolder.txt");


// 이건 패턴임. 파일 fs관련 할 때는 이 패턴 인 듯
// fs.메소드(경로, 옵션, 콜백(에러, 데이터))    콜백은 파일로드 또는 에러 시 할 행동
fs.open(FILE_PATH, 'r', (err, fd)=>{
  if(err){
    return console.log(err);
  }

  console.log("파일을 정상적으로 읽을 수 있습니다.");

  fs.readFile(FILE_PATH, 'utf-8', (err, data)=>{
    if(err)  return console.log(err);

    console.log(data);

    try{
      const data = fs.readFileSync(FILE_PATH, "utf-8");
      console.log(data);
    }catch(err){
      console.log(err);
    }
  })
});

fs는 파일시스템, 파일 읽기 열기 쓰기 수정 등 파일과 관련된 라이브러리

path는 경로와 관련된 라이브러리.

예를 들어

path.join(__dirname, "파일명")

하면 그걸 경로 string으로 만들어 줌. 보통 경로표시 하려고 하면 그냥 문자열로 하려고 하면 이스케이프문자라서 좀 신경좀 써야 함. 그냥 path이용하는게 편하긴 함. 물론 못할 건 아님.

__dirname은 그냥 자바스크립트 자체에서 지원하는 현재경로 인거 같음.

 

여튼 저 FILE_PATH처럼 인자 여러개로 받을 수 있음.

 

fs 여러개 있음.

fs.open() : 파일 열기. 메모리 상 여는거임.

fs.readFile() : 파일 읽기. 파일 내용을 직접적으로 읽는거임.

fs.writeFile() : 파일 쓰기. 파일 만들기. 

fs.mkdir() : 디렉토리 만들기.

fs.appendFile() : 기존 파일에 추가하기

fs.access() : 파일 접근. 접근할 수 있는지 확인하는데 쓸 듯.

fs.unlink() : 파일 삭제할 때 씀.

fs.rename() : 파일 이름 변경.

fs.copyFile() : 파일을 복사해서 지정한 경로에 넣음.

fs.stat() : 파일 또는 폴더의 상태.. 뭐 데이터나 만들어진 날짜 등 볼 수 있음. 파일인지 폴더인지 등도

 

fs는 저 패턴으로 씀

fs.메소드(경로, 옵션, 콜백(에러, 데이터))

이런 모양새인데 메소드마다 조금 씩 다름.

 

저 콜백에 파일 읽기 완료 시와 에러 발생 시 처리할 로직을 씀.

 

그리고, Sync라고 붙어 있는게 있는데, 이건 return값을 주는 거 인듯.

예를 들어 readFileSync()는 return이 됨.

일단 직역으로는 동기, 라는 걸로 동기적으로 처리해주는 거임.

하긴 동기적으로 처리해야 연속적으로 계산하는 순간에 데이터를 줘도 문제가 없지.

 

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

const PATH = __dirname + "/words";
const FILE_NAME = "/text.txt";
const RESOURCE_FILE_PATH = __dirname + "\\resource\\words\\quotes.txt";

console.log(RESOURCE_FILE_PATH);

readFile(RESOURCE_FILE_PATH);

function updateFile(path) {
  fs.appendFile(path, "\nUpdated!!!", null, (err) => {
    if (err) {
      console.error("Can't update file\n");
      console.error(`file : ${path}`);
      return;
    }
    console.log("파일 업데이트 완료.");
    console.log(`경로 : ${path}\n`);
    // fileOpen(path);
  });
}

function fileOpen(path) {
  fs.open(path, (err, fd) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log("파일 오픈");
    console.log(`경로 : ${path}\n`);
  });
}

function makeDir(path, data) {
  fs.mkdir(path, (err) => {
    if (err) {
      console.error("폴더가 이미 존재합니다. 폴더를 생성하지 않습니다.\n");
      makeFile(path, data);
    } else {
      console.log(`디렉토리 생성 완료. \n경로 : ${path}`);
      makeFile(path, data);
    }
  });
}

function makeFile(path, data) {
  let filePaht = path + "\\text.txt";
  fs.writeFile(filePaht, data, "utf8", (err) => {
    if (err) {
      console.error("Can't make a file");
      console.error(err);
      return;
    }
    console.log("파일생성 완료.");
    console.log(`경로 : ${path}\n`);
    updateFile(filePaht);
  });
}

function readFile(path) {
  fs.readFile(path, "utf-8", (err, data) => {
    if (err) {
      console.error("파일 읽기 에러");
      console.error(err);
      return;
    } else {
      makeDir(PATH, data);
      return;
    }
  });
  return;
}

대충 다 짜본거. 되긴 됨.

아 근데 이거 너무 콜백지옥임.

 

 

대충

fs.mkdir(폴더경로, 콜백(에러))

파일경로에, 그러니까 경로로 폴더가 생성됨. 상위경로/폴더이름 까지 경로에 있어야 저 폴더이름 폴더가 생성되는 거.

 

fs.writeFile(파일경로, 데이터, 옵션, 콜백(에러))

옵션은 "utf-8" 썼는데, 어떤 문서에 대한 옵션이려나? 

여튼 이것도 파일경로라고 했으니 상위경로/파일명 까지 있어야 하고, 

그 안에 데이터가 써지는 거임.

옵션은 "utf-8" 줬음.

 

fs.open(경로, 콜백(에러, 파일설명자))

그냥 경로의 파일을 여는거다.

파일설명자라는게 파일을 열 때, 정수값이 반환되는데,

첫번째 열린파일은 3, 두번째는 4, ... 이런다는데,

0은 표준입력,

1은 표준출력,

2는 표준오류 이런다는데..

그러니까 보통 3,4,5... 이런 게 정상이라는 건가?

아직 이걸 쓸 이유는 잘 모르겠다.

여튼

fs.open은 주로

파일의 상태를 확인하려 할 경우

파일에 대한 고급작업, fs.ftruncate, fs.fchown, fs.chmod 등 하려고 할 경우(권한 주는 그런 것 들 인듯.)

여튼 권한과 관련된 작업이나 파일 상태를 알려고 하거나 그러려고 하는 거 인듯.

보통 readFile같은 거에 오픈-> 읽기 다 되서 잘 쓸지는 모르겠음.

 

fs.readFile(파일경로, 옵션, 콜백(에러, 데이터))

파일경로의 파일을 옵션으로 읽음.

마찬가지로 콜백에 파일을 제대로 로드 했을때나 에러 발생시에 할 로직 작성

 

fs.appendFile(파일경로, 데이터, 옵션, 콜백(에러))

파일경로의 파일에 데이터를 추가함.

옵션은 utf-8 이런 거 인듯.

 

fs.access(파일경로, 옵션, 콜백(에러))

파일에 접근해 보는 거.

사실 접근해 본다는 게 어떤 건지는 잘 모르겠으나, 아마 접근할 수 있는지, 그러니까 파일이 있는지 없는지? 

그런 거 확인할 때 쓸 수 있을 듯?

옵션으로 fs.constants.F_OK를 줬는데, 

직역으로 fs의 상수의 F_OK

F_OK : 파일 존재여부

R_OK : 읽기 권한 여부

W_OK : 쓰기 권한 여부

 

참고로 간간히 볼 수 있는 ENOENT는 파일/폴더가 없을 때 나오는 에러코드임.

 

fs.copyFile(복사할파일, 복사될경로, 콜백(err))

복사할파일 복사한 다음 복사될 경로에 붙여넣기.

 

fs.stat(파일경로, 콜백(에러, 상태))

파일이나 폴더의 상태를 알아보는 건데, 파일인지 폴더인지도 알 수 있다.

상태가 객체라, 예를 들어 상태.isDirectory() 이런 메소드도 있다. 여러 상태를 알 수 있다.

파일 생성시간.. 크기 등등등

 

 

 

여튼, 행동은 파일(혹은 폴더를)을 ~~ 한다.

인데, 파일을 ~~ 했을 때 (로드했거나 저장했거나 추가했거나 등)

할 행동을 콜백함수에 넣으면 됨.

 

 

 

엄청나게 많다. 

 

 

 

참고로 이거, 

require("fs").promises

하면 동기 비동기 처리 가능한 프로미스 반환하는 걸로 가져온다.

async await 처리 가능하다.

이게 더 편할 듯 싶다.

보통 fs는 콜백지옥이 발생할 수 있다.

const REMOVE_PATH = async (p, callback)=>{
  try{
    const stats = await fs.stat(p);
    if(stats.isDirectory()){
      const files = await fs.readdir(p);
      if(files.length){
        for(const file of files){
          await REMOVE_PATH(path.join(p, file));
        }
      }
      console.log("이 경로는 폴더입니다.")
      await fs.rmdir(p);
      return p;
    }else{
      console.log("이 경로는 파일입니다.");
      await fs.unlink(p);
      return p;
    }

  }catch(e){
    throw e;
  }
 
}

파일 관련된 것은 아무래도 외부에서 읽어오는 거니 시간이 어찌 걸릴 지 몰라 기본이 비동기 처리하도록 되어 있어서, 

프로미스는 그걸 동기적으로 해결하기 위해 하는 것.

 

 

'프론트엔드-코드 > Node.js' 카테고리의 다른 글

express  (0) 2023.10.30
서버 띄우기 2 url마다 다르게 받기  (0) 2023.10.12
프로젝트 폴더에 파일 생성 -미완  (0) 2023.10.06
프로젝트 폴더에 폴더 생성  (0) 2023.10.06
서버 띄우기  (0) 2023.10.05