node.js

fs 모듈(File System)

fs 모듈

http://nodejs.org/api/fs.html

fs 모듈은 FileSystem의 약자로 파일 처리와 관련된 모듈입니다. 메소드가 굉장히 많은데 가장 중요하고 기초라고 할 수 있는 파일 읽기와 쓰기 위주로 살펴 보겠습니다.

 

파일 읽기

filename의 파일을 [options]의 방식으로 읽은 후 callback으로 전달된 함수를 호출합니다. (비동기적)

filename의 파일을 [options]의 방식으로 읽은 후 문자열을 반환합니다. (동기적)

Sync가 붙은 것은 동기적 읽기, 붙지 않은 것은 비동기적 읽기입니다. 파일을 읽는데 시간이 오래 걸릴 수도 있습니다. 동기적 읽기로 읽게 되면 파일을 읽으면서 다른 작업을 동시에 할 수 없습니다. 하지만 비동기적으로 읽으면 파일을 읽으면서 다른 작업도 동시에 수행할 수 있고 파일을 다 읽으면 매개변수 callback으로 전달한 함수가 호출됩니다.

[options]에는 보통 인코딩 방식이 오게 되며 웹에서는 utf8을 주로 사용합니다.

파일을 읽어야 하므로 text.txt라는 이름으로 텍스트 파일을 하나 준비합니다.

예제

fs 모듈
파일 입출력 연습
// readFile.js

var fs = require('fs');

// 동기적 읽기
var text = fs.readFileSync('text.txt', 'utf8');
console.log(text);

// 비동기적 읽기
fs.readFile('text.txt', 'utf8', function(err, data) {
    console.log(data);
});

실행 결과

$node readFile.js
fs 모듈
파일 입출력 연습
fs 모듈
파일 입출력 연습

비동기적 읽기에서 callback으로 전달된 함수는 매개변수로 err와 data를 갖습니다. 파일로부터 읽은 데이터 내용이 매개변수 data로 전달되어 함수 내에서 접근할 수 있습니다. err와 관련해서는 아래 예외처리 부분에서 살펴보겠습니다.

 

파일 쓰기

filename의 파일에 [options]의 방식으로 data 내용을 쓴 후 callback 함수를 호출합니다. (비동기적)

filename의 파일에 [options]의 방식으로 data 내용을 씁니다. (동기적)

사용법이나 동기적/비동기적 차이는 파일 읽기 메소드와 비슷합니다.

예제

// writeFile.js

var fs = require('fs');

var data = 'Hello FileSystem';

fs.writeFile('text.txt', data, 'utf8', function(err) {
    console.log('비동기적 파일 쓰기 완료');
});


fs.writeFileSync('text2.txt', data, 'utf8');
console.log('동기적 파일 쓰기 완료');

실행 결과

$node writeFile.js
동기적 파일 쓰기 완료
비동기적 파일 쓰기 완료

$cat text.txt
Hello FileSystem

$cat text2.txt
Hello FileSystem

 

예외 처리

파일 입출력은 매우 다양한 원인으로 예외가 발생할 수 있습니다. 권한이 없다거나 존재하지 않는 파일을 읽는다거나 심지어 하드디스크 용량을 초과할 수도 있습니다. 동기적인 방식과 비동기적인 방식에서 예외를 처리하는 방법이 조금 다르므로 따로 알아보겠습니다.

동기적 방식의 예외처리

동기적 방식에서는 자바스크립트의 일반적인 예외처리 방식인 try ~ catch 구문으로 처리합니다.

예제

// exceptionHandleSync.js

var fs = require('fs');

// 파일 읽기
try {
    // 존재하지 않는 파일을 읽으려 합니다.
    var data = fs.readFileSync('nonExist.txt', 'utf8');
    console.log(data);
}
catch(err) {
    console.log(err);
}

// 파일 쓰기
try {
    // 루트 위치에 파일을 쓰려고 합니다.(권한 거부)
    fs.writeFileSync('/unauthorized.txt', 'Hello World', 'utf8');
    console.log('파일 쓰기 성공');
}
catch(err) {
    console.log(err);
}

실행 결과

$node exceptionHandleSync.js
{ [Error: ENOENT, no such file or directory 'nonExist.txt']
  errno: 34,
  code: 'ENOENT',
  path: 'nonExist.txt',
  syscall: 'open' }
{ [Error: EACCES, permission denied '/unauthorized.txt']
  errno: 3,
  code: 'EACCES',
  path: '/unauthorized.txt',
  syscall: 'open' }

위와 같이 예외가 발생하면 그 예외와 관련된 객체를 throw하게 됩니다.

비동기적 방식의 예외처리

비동기적 방식에서 예외가 발생하면 callback 함수의 매개변수 err에 전달되므로 따로 try ~ catch 구문을 사용할 필요가 없습니다.

예제

// exceptionHandle.js

var fs = require('fs');

// 파일 읽기
// 존재하지 않는 파일을 읽으려 합니다.
fs.readFile('nonExist.txt', 'utf8', function(err, data) {
    if(err) {
        // 파일 읽기 실패
        console.log(err);
    }
    else {
        // 파일 읽기 성공
        console.log(data);
    }
});

// 파일 쓰기
// 루트 위치에 파일을 쓰려고 합니다.(권한 거부)
fs.writeFile('/unauthorized.txt', 'Hello World', 'utf8', function(err, data) {
    if(err) {
        // 파일 쓰기 실패
        console.log(err);
    }
    else {
        // 파일 쓰기 성공
        console.log('파일 쓰기 성공');
    }
});

실행 결과

$node exceptionHandle.js
{ [Error: EACCES, open '/unauthorized.txt'] errno: 3, code: 'EACCES', path: '/unauthorized.txt' }
{ [Error: ENOENT, open 'nonExist.txt'] errno: 34, code: 'ENOENT', path: 'nonExist.txt' }

만약 예외가 발생하지 않았다면 err에 아무 값도 들어가지 않아서 if문이 false가 됩니다. 

댓글

댓글 본문
  1. 쳐리맛
    좋은 정보 감사합니다
  2. 한도영
    FileSystem 사용하는 방법을 찾다가 왔습니다. 좋은 정보 감사합니다.
  3. 나무마루
    항상 좋은 내용 감사드립니다.
  4. 나무마루
    네.
버전 관리
miki
현재 버전
선택 버전
graphittie 자세히 보기