일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Router
- 개발자
- 이벤트 루프
- 자바
- 특징
- Django
- RDF
- nodejs
- 스크럼
- Groovy
- java
- 예제
- Stream
- 파헤쳐보자
- express
- C++
- scrum
- Python
- 스크럼 마스터
- 소켓
- 지식 그래프
- ngrinder
- socket.io
- 노드js
- node
- Knowledge Graph
- 스레드
- node.js
- benchmark
- 노드
- Today
- Total
라봉이의 개발 블로그
nodejs fs 모듈 open 함수, stat 함수, read 함수. 파일 중간 위치에서 파일 읽기 본문
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: 파일 디스크럽터
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);
});
});
});
'Node.js' 카테고리의 다른 글
chalk: 로그에 색을 입혀보자. (pm2에서의 색 나오지 않는 오류) (0) | 2018.08.07 |
---|---|
[Node.js][노드] stream(스트림) 이란?? (2) | 2018.06.08 |
[nodejs][socket.io] nodejs socket.io 사용기-2. room 사용, 현재 연결된 socket 찾기, disconnect 이벤트 (4) | 2018.05.13 |
[nodejs][socket.io] nodejs socket.io 사용기-1. socket.io란? 간단한 예제 코드 살펴보기 (0) | 2018.05.13 |
[node js] node.js 동작 원리, node.js 구조 및 시스템, event loop 구조 (0) | 2018.03.30 |