라봉이의 개발 블로그

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

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);
        });
    });
});


반응형
Comments