개발언어/Node.js

NodeJS File의 다양한 사용법

Surge100 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 ]