ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NodeJS File의 다양한 사용법
    개발언어/Node.js 2022. 8. 2. 13:57

    FileSystem

    //const fs = require('fs');
    const fs = require('fs').promises;

    앞에서는 'fs'키워드를 이용해서 FileSystem 모듈을 가져왔다면, 이번에는 기본적으로 promise 형태인 FileSystem 모듈을 가져올 것이다. 즉 fs라는 변수는 FileSystem안에 있는 promise들을 가르키고 있는 것이다.


    1.Read a file

    //read a file
    fs.readFile("./text.txt")
      .then((data) => console.log(data))
      .catch(console.error);

    fs의 readFile()이라는 메서드를 이용한다. 해당 메서드의 인자로 file의 경로를 전달해 준다. 그 다음에 file에서 읽어오 data가 잘 읽어와 지면, console.log()를 통해서 data를 출력하고, error가 발생 하면 console.error를 통해서 error를 출력한다.

     

    => 실행 후 console 출력결과 

    => 해당 file

    해당 text.txt 파일에는 Hello!!가 적혀져 있는다.근데 메서드 readFile()은 Hello!!라는 data를 buffer형태로 읽어온다.

     

    const fs = require("fs").promises;
    
    //read a file
    fs.readFile("./text.txt", "utf-8")
      .then((data) => console.log(data))
      .catch(console.error);

    메서드readFile()의 정의부에 가서 확인해보면, 메서드의 두번째 인자를 통해 optional로 encoding방식 혹은  flag값으로  file을 열때 읽기 mode로 열 것인지 쓰기 모드로 열 것인지 선택할 수 있다.

     

    두번째 인자를 'utf-8' 넣어 encoding이 되게 하고 나서 결과를 출력한다.

     

    => 실행 후 console 출력결과 

    encoding된 text가 출력되는 것을 확인 할 수 있다.

     


    2.Writing a file

    //writing a file
    fs.writeFile("./file.txt", "Hello, World!!") 
      .catch(console.error);

    => 코드 실행 후 디렉토리 구성

    fs에 속한 writeFile() 메서드의 첫번째인자로 어디에 쓸건지 file의 경로를 문자열로 지정해 준 다음에 두번째 인자로 쓰려고 하는 내용을 넘겨주면 된다. 

     

    fs.writeFile()정의를 보면, Promise가 void type이라는 것을 확인 할 수 있다. 즉 이 메서드는 실행 결과롤 아무런 것도 return 되지 않는다. 그렇기 때문에 따로 then()을 사용하지 않아도 되지만 catch는 해주어야 한다. 항상 error 발생의 가능성이 있으므로 catch를 작성해 주는 것이 좋다.

     

    => 코드 실행 후 출력 결과

    X(없음)

    => 코드 실행 후 디렉토리 구성

    첫번째 인자로 넣은 경로에 file 생기고, 해당 파일에 두번째 인자로 넣은 내용이 정상적으로 출력되고 있는 것을 확인 할 수 있다.

     

    Writing a file 이용해서 동일한 file에 다른 문자 넣기

    //writing a file
    fs.writeFile("./file.txt", "Hi, World!!") 
      .catch(console.error);

    => 코드 실행후 파일의 내용

    file의 내용이 두번째인자로 전달한 값과 일치하는 것을 확인 할 수 있다.

     

    appendFile()

    fs.appendFile("./file.txt", "hi again") 
      .catch(console.error);

    기존에 file에 내용을 덮어 쓰고 싶은 것이 아니라 즉 기존의 data를 유지하면서, 추가적으로 내용을 적고 싶다면 fs의 appendFile()메서드를 사용하면 된다.

     

    => 코드 실행후 파일의 내용


    3.Copy a file

    copyfile

    //copy
    fs.copyFile("./file.txt", "./file2.txt") 
      .catch(console.error);

    file을 복사하는 것도 가능한데 fs에 있는 copyFile()메서드를 이용해서 첫번째 인자로 복사해올 file의 경로를 두번째 인자로  전달한다.

     

    copyFile()메서드도 void를 return 함으로 .catch()를 받아 준다. 

     

    => 실행 후 출력 결과

    => 실행 후 디렉토리

     

    정상적으로  file2.txt. file이 생성 되었지만 file2.txt를 열어 보면 아무런 내용도 적혀 있지 않은 것을 확인 할 수 있다. 왜냐하면 모든 것 들이 다 비동기적으로 처리 되어, data를 쓰기도 전에 file.txt를 복사하여 file2.txt를 복사 했을 수도 있다.

     

    동기적으로 file생성후 복사

    fs.appendFile("./file.txt", "hi again")
      .then(() => {
        //copy
        fs.copyFile("./file.txt", "./file2.txt") //
          .catch(console.error);
      })
      .catch(console.error);

    appendFile()메서드 뒤에 .then()메서드을 체인으로 달고 그안에 copyFile()을 실행하는 함수를  집어 넣어 , appendFile()를 수행하고 나서 문제가 없으면  copyFile()이 실행 되도록 해준다.

     

    => 실행 후 file2.txt 

    file.txt안에 적힌 내용까지 잘 복사되어 진 것을 확인 할 수 있다.

     

    🔔비동기는 순차적으로 될 수 도 있고 안될 수도 있기 때문에 이점에 유의해서 코드를 작성해야 한다. 순서대로 코드를 작성했지만 모든 것이 다 Promise이므로 비동기적으로 처리가 되므로 순서가 보장이 되지 않는다. 순서가 중요한 경우라면 .then()안에서 해당하는 Promies가 수행이 된다음에 특정한 일을 해야 한다.


    4.folder

    mkdir()

    디렉토리를 만드는 메서드 이다.

    // folder
    fs.mkdir("sub-folder") 
      .catch(console.error);

    mkdir()도 반환하는 값이 없으로 동일하게 catch()를 이용하면 된다.

     

    => 실행 후 디렉토리 

    sub-folder가 정상적으로 생성된 것을 확인 할 수 있다.

     

    readdir()

    fs.readdir("./") //
      .then(console.log)
      .catch(console.error);

     

    해당하는 경로에 있는 모든 file의 이름을 읽어 올 수 있다. 해당 함수의 반환되는 값이 string이므로 then()을 이용해서 return 값을 출력한다.

     

    => 실행 후 출력 결과

    현재 경로안에 있는 모든 file들의 이른과 folder에 이름이 출력되는 것을 확인 할 수 있다.


    API 사용시 주의 사항

    api를 사용할 때는 항상

    1.인자는 어떤 것이 있는지

    2.추가적으로 전달해야하는 option같은 인자들이 있는지

    3.함수에서 return 되는 값은 무엇인지

    4.반환 type이 Promise라면, error 발생 시 catch()매서드를 사용해서 error를 잡아는 것이 중요하다.

     

    [출처 -https://academy.dream-coding.com/courses/node ]

    '개발언어 > Node.js' 카테고리의 다른 글

    NodeJS 서버  (0) 2022.08.02
    NodeJS Buffer and Stream outline  (0) 2022.08.02
    NodeJS File async와 asynchronous 그리고 promise  (0) 2022.07.28
    NodeJS Path 그리고 유의할 점  (0) 2022.07.27
    NodeJS Timer와 Call Stack의 연관  (0) 2022.07.09

    댓글

Designed by Tistory.