Node.js

nodejs fs 모듈 open 함수, stat 함수, read 함수. 파일 중간 위치에서 파일 읽기

Labhong 2018. 5. 21. 19:34
반응형

nodejs의 기본 모듈 중 하나인 fs는 file system의 약어이다.

말 그대로 fs 모듈을 이용해 파일 시스템에 사용되는 기능들을 사용할 수 있다.


fs는 표준 POSIX 함수와 비슷하게 만들어놨기 때문에 예전에 리눅스 프로그래밍을 배운 필자로서는 fs모듈이 매우 흥미롭게 다가왔다.


모든 파일 시스템 연산은 동기식비동기식 존재하는데 비동기식은 모두 연산이 완료되었을 시 마지막 argument에 callback으로 전달한다.

callback의 첫번째 argument는 예외처리가 담긴 변수인데 예외가 없을 시 undefined나 null이 반환된다.


동기식의 오류처리는 try/catch로 잡을 수 있다고 하는데 nodejs에서 동기식을 사용한다는 것은 매우 비효율적이므로 따로 적지는 않겠다.


fs.stat


fs.stat을 살펴보도록 하자.

먼저 stat 객체파일에 대한 정보들이 담겨있다.

Stats {
  dev: 2114,                       // ID of device containing file
  ino: 48064969,                 // inode number
  mode: 33188,                  // protection
  nlink: 1,                           // number of hard links
  uid: 85,                           // user ID of owner
  gid: 100,                         // group ID of owner
  rdev: 0,                           // device ID (if special file)
  size: 527,                        // total file size, in bytes
  blksize: 4096,                  // blocksize for file system I/O
  blocks: 8,                       //  number of 512B blocks allocated
  atimeMs: 1318289051000.1,                       // time of last access in milliseconds
  mtimeMs: 1318289051000.1,                      // time of last modification in milliseconds
  ctimeMs: 1318289051000.1,                       // time of last status change in milliseconds
  birthtimeMs: 1318289051000.1,                   // The timestamp indicating the creation time of this file in milliseconds
  atime: Mon, 10 Oct 2011 23:24:11 GMT,      // time of last access
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,     //  time of last modification
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,      // time of last status change
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT   // The timestamp indicating the creation time of this file
 }

출처: https://nodejs.org/api/fs.html#fs_fs_stat_path_callback

http://man7.org/linux/man-pages/man2/stat.2.html


fs.stat의 사용방법은 다음과 같다.


fs.stat(path, callback)

  • path: 파일 정보를 살펴 볼 파일의 경로
  • callback: 콜백 함수
    - err: 에러 객체
    - stats: 위의 stat 객체

example)

fs.stat('./test.txt', function(error, stats) {
    console.log("파일 크기: ", stats.size);
});



여기서는 파일의 크기를 가져오기 위해서 사용했다.


다음으로 fs.open을 살펴보자.



fs.open


fs.open은 비동기로 파일을 open할 때 사용하는 함수이다.

fs.open을 사용하는 방법은 다음과 같다.


fs.open(path, flags[,mode], callback)

  • path파일 정보를 살펴 볼 파일의 경로
  • flags: 파일을 open할 때의 option
  • mode(옵션): 파일 퍼미션 설정(파일을 생성할 때만 설정하는 옵션)
  • callback: callback함수
    - err: 에러 객체
    - fd: 파일 디스크럽터
flags에 대한 설명은 다음과 같다.

flag: 
  'r' - 읽기로 열기. 파일이 존재하지 않으면 에러발생.
  'r+' - 읽기/쓰기로 열기. 파일이 존재하지 않으면 에러발생.
  'w' - 쓰기로 열기. 파일이 존재하지 않으면 만들어지고, 파일이 존재하면 지우고 처음부터 씀.
  'w+' - 읽기/쓰기로 열기. 파일이 존재하지 않으면 만들어지고, 파일이 존재하면 처음부터 씀.
  'a' - 추가 쓰기로 열기. 파일이 존재하지 않으면 만들어짐.
  'a+' - 파일을 읽고/추가쓰기모드로 열기. 파일이 존재하지 않으면 만들어짐.


fs.read


fd(파일 디스크럽터)를 이용해 특정한 파일의 데이터를 읽는 함수이다.

fs.read를 사용하는 방법은 다음과 같다.


fs.read(fd, buffer, offset, length, position, callback)

  • fd: 파일 디스크럽터. fs.open함수에서 얻을 수 있다.
  • buffer: 데이터가 쓰여질 버퍼
  • offset: 데이터가 쓰여질 버퍼의 시작 위치이다.
  • length: 데이터를 읽을 문자열의 크기이다.
  • position: 데이터를 읽어들일 파일의 읽을 위치를 지정한다. 만약 값이 null이면 파일의 현재 위치에서부터 읽기 시작한다.
  • callback: callback 함수
    - err: 에러 객체
    - bytesRead: 읽어들인 문자열 길이
    - buffer: 읽은 문자열이 담긴 버퍼


따라서 만약 파일의 일부분만 읽어오고 싶다면 다음과 같은 코드를 작성하면 된다.


fs.stat('test.txt', function(error, stats) {
    fs.open('test.txt', "r", function(error, fd) {  // 읽기 모드로 test.txt 파일 열기
        console.log("파일의 크기: ", stats.size);
        if(error) console.log("error: ", error);    // 에러 있을 시 에러 출력
        let buffer = new Buffer(100);        // 버퍼의 크기를 100으로 함
        fs.read(fd, buffer, 0, buffer.length, 84, function(error, bytesRead, buffer) {
            // buffer에 담을 위치 0, txt 파일 시작 위치는 84
            let data = buffer.toString("utf8");
            console.log(data);
            console.log("읽은 버퍼 크기: ", bytesRead);
        });
    });
});


반응형