본문 바로가기

Node.js/[Node.js]

[Node.js] fs.readFile (파일 읽기) / fs.readdir(파일 목록 가져오기)

fs모듈에는 많은 메소드들이 있다.

그 중에서 파일을 읽는것과 관련한 메소드들이 있다.

대부분의 메소드들은 동기식 IO와 비동기식 IO를 모두 제공한다.

보통 메소드에 Sync라는 이름이 붙어있으면 동기방식을 사용한다고 보면 된다.

 

동기적 읽기방식은 파일을 읽으면서 다른 작업들을 동시에 할 수 없고, 값을 함수 안에서 바로 리턴한다.  비동기적 읽기방식은 파일을 읽으면서 다른 작업들도 동시에 수행할 수 있고, 파일을 다 읽으면 매개변수 callback으로 전달한 함수가 호출된다. 비동기 형식은 항상 마지막 인수가 수행 완료되었을때 호출할 콜백 함수로 작성되어야 한다.

 

참고로 오늘 소개할 두 메소드들은 둘다 callback함수를 통해서 비동기식방식으로 처리된다!

 

파일 읽기 : fs.readFile

//     nodejs/fileread.js
fs.readFile('./nodejs/sample.txt', (err, data) => {
  if (err) throw err;
  console.log(data);
});

위와같은 방식으로 사용이 가능하다.

콜백을 통해 sample.txt파일 안에있는 텍스트가 data 변수에 담기고 콘솔창에 출력된다.

 

 

그런데 fs는 기본적으로 콜백 형식의 모듈이므로 실무에서 사용하기가 불편하다.

따라서 fs 모듈을 프로미스 형식으로 바꿔주는 방법을 사용한다.

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

fs.readFile('./nodejs/sample.txt')
	.then((data) => {
		console.log(data);
	})
	.catch((err) => {
		console.error(err);
	})

fs 모듈에서 promise 속성을 불러오면 프로미스 기반의 fs 모듈을 사용할 수 있게 된다.

추가적으로 async/await 함수도 쓸 수 있게 된다!

 

 

★경로 지정할때 주의사항

현재 위의 fileread.js 코드, 읽고자 하는 sample.txt 파일이 있는 위치는

Nodejs_Practice/nodejs  이 곳이다.

 

주의해야 할 점은

경로를 지정할때 위의 fileread.js파일을 기준으로 한 sample.txt 파일의 경로를 적는것이 아니라

node가 실행되는 위치를 기준으로 해서 sample.txt 파일의 경로를 적어야 한다.

 

현재 node가 실행되는 위치Nodejs_Practice 이곳이다.

따라서 위 코드에 경로를 적을때

'./sample.txt' 라고 적으면 에러가 뜨고,

'./nodejs/sample.txt' 라고 적어야 한다.

 

 

디렉토리에 있는 파일 목록들 가져오기 : fs.readdir

위의 readFile과는 다르게 디렉토리에 있는 파일 목록들을 읽어오는 메소드이다.

불러올 폴더에 있는 파일명들을 배열에 담을 수 있다.

var fs = require('fs'); 
fs.readdir('./data', function(err, filelist){  // 배열 형태로 출력
        console.log(filelist);
})
fs.readdir('./data', (err, filelist) => { // 하나의 데이터씩 나누어 출력
    filelist.forEach(file => {
        console.log(file);
    });
})

data폴더

==>출력결과

[ 'CSS', 'HTML', 'JavaScript' ]
CSS
HTML
JavaScript

data폴더에 있는 파일을 readdir메소드를 이용해서 파일 목록들을 가져온 뒤 출력한 결과이다.