Back Ground

NodeJS - 파일을 직접 열고 닫으면서 읽거나 쓰기 [ES5] 본문

Javascript/Node.js

NodeJS - 파일을 직접 열고 닫으면서 읽거나 쓰기 [ES5]

Back 2018. 9. 14. 13:45


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

 파일을 엽니다.

 read(fd, buffer, offset, length, position [, callback])

 지정한 부분의 파일 내용을 읽어 들입니다.

 write(fd, buffer, offset, length, position [, callback])

 파일의 지정한 부분에 데이터를 씁니다.

 close(fd [, callback])

 파일을 닫아 줍니다.



.open을 이용하여 파일처리를 한다.


var fs = require('fs');

로 파일모듈을 부른 후


fs.open()으로 파일객체을 열어서 사용한다. (wrtieFile처럼 바로 파일 데이터에 접근하는 방식이 아닌 파일객체를 여는것)


Falge 종류 

 w

 쓰기(write)

 r

 읽기(read)

 a

 추가(append)



.open 파일열기


메소드


fs.open('./study/day_05/aaa.txt','w',function(err,fd)
cs


매개변수

어디에(파일),무엇을(플레그),콜백 (에러 ,파일 접근 객체)

-fd (fileData) 실제 데이터가 아니라 파일을 접근할 수 있는 접근 객체





.write  쓰기

메소드

1
 fs.write( fd ,buf ,0 ,buf.length ,nullfunction(err ,written ,buffer)
cs

매개변수

어디에 , 누구를,(퍼버기준)어디부터 ,어디까지 ,옵션, 콜백(에러,버퍼 byte크기,버퍼데이터)






예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var fs = require('fs');
 
 
fs.open('./study/day_05/aaa.txt','w',function(err,fd){
   
    var buf = new Buffer('ㅋㅋ ㅋㅋ ㅋ\n');
    console.log("open 이후");
    console.log(buf);
    console.log(buf.length);
    
    fs.write(fd,buf,0,buf.length,nullfunction(err,written,buffer){
     
        console.log('write 이후');
        console.log("err : "+err,"\n\written :"+written,"\n\buffer "+buffer);
        
    
        fs.close(fd, function(){
    
        });
    }); 
        
});
cs


9번 console.log(buf.length)

여기서는 '버퍼'의 byte 크기가 나온다 (길이와 상관없다.)


버퍼를 생성 한 후 

write()를 사용하여 글을 쓴다.


매개변수로 open에서 받은 fd(파일 접근객체)로 부터  buf(버퍼)를 0 부터 버퍼의 마지막까지 쓴 후 콜백 한다.


그 후 파일객체를 .close 해서 닫아준다.







open으로 열고 wirte로 쓰기

예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var fs = require('fs');
 
fs.open('./output.txt''w'function(err, fd) {
    if(err) throw err;
    var buf = new Buffer('안녕!\n');
    fs.write(fd, buf, 0, buf.lengthnullfunction(err, written, buffer) {
        if(err) throw err; 
        console.log(err, written, buffer);
     
        fs.close(fd, function() {
            console.log('파일 열고 데이터 쓰고 파일 닫기 완료.');
        });
    });
});
 
cs





open으로 열고 wirte로 쓰는 과정




.raed 쓰기


메소드

1
.read(fd,buf,0,buf.lengthnull , function(err,bytesRead,buffer)
cs


매개변수

파일객체,누구를,어디부터,어디까지, 기능, 콜백(에러,읽어온 데이터 바이트 크기,읽어온 버퍼)



예제)

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
32
33
34
35
var fs = require('fs');
 
fs.open('./study/day_05/aaa.txt','r',function(err,fd){
    var buf = new Buffer(20); //10nyte까지 가져온다.
    
    //read를 하면 open이 되있는동안 aaa.txt의 버퍼 나눠서 가져온것을 기억을 한 후 다음 가져올 대상을 가져온다.
    fs.read(fd,buf,0,buf.lengthnull , function(err,bytesRead,buffer){
        //데이터는 bytesRead가 갖고있다.
        var data = buffer.toString('utf8',0,bytesRead);
        
        console.log(
            "err : "+err
//            ,"\n\byteRead : "+bytesRead
            ,"\n\buffer: "+buffer
        );
        
        fs.read(fd,buf,0,buf.lengthnull , function(err,bytesRead,buffer){
            var data = buffer.toString('utf8',0,bytesRead);
            
             console.log(
                 "err : "+err
//                 ,"\n\byteRead : "+bytesRead
                 ,"\n\buffer: "+buffer
            );
            
            fs.close(fd,function(){
                console.log("파일읽기 종료");
            });  
            
        });
    });
});
 
 
 
cs


여기서 .open에 w 가 아닌 r 플레그를 써줘야 한다. 


Read를 할때 버퍼에서 읽어서 가져온 후 0~10바이트(new Butter(10))까지 

가져오고 다시 Read 했을때 가져온 버퍼는 사용하여 없으므로

다음 버퍼들 가져온다.

즉, 다음 버퍼를 가져온다.



버퍼의 크기를 나누는 이유

이렇게 버퍼를 크기를 나눠서 가져오는 이유는 보통

서버로부터 데이터를 호출하는데 파일 클 경우 한번에 모든 데이터를 보내면

장애가 생길수 있기 때문에 나눠서 보내는 방식이다. 


예를 들어 동영상을 재생해서 본다고 하면 

동영상은 그림+오디오의 모음의 데이터를 보내게 될때

한번에 다 보내기엔 양이 많을 수 있기 때문에 나눠서 보낸다.

그것이 버퍼링



이렇기 때문에 Read는 데이터가 끝날때 까지 다 불러야 하기에 

재귀 함수를 사용하여 만들면 간편하게 사용할 수 있다.



예제)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var fs = require('fs');
 
//파일열기(파일경로,flags, callback)
fs.open('./study/day_05/aaa.txt','r',function(err,fd){
    var buf = new Buffer(20); //10nyte까지 가져온다.
    
    Read_fn(fd,fs,buf);
});
    
function Read_fn(fd,fs,buf){
     fs.read(fd,buf,0,buf.lengthnull , function(err,bytesRead,buffer){
        var data = buffer.toString('utf8',0,bytesRead);
 
        console.log("buffer: "+buffer);
         
         if(bytesRead != 0){
            Read_fn(fd,fs,buf);
         }else{
            fs.close(fd,function(){
                console.log("파일읽기 종료");
            });
         }
    });
};
cs



이렇게 bytesRead가 0이 아니라면 또는 0보다 크다면

계속 호출하게 만들면 지정한 파일의 데이터를 볼수있다.


Read 뿐만 아니라 Wirte 또한 나눠서 보내는걸 잊지말자.

Comments