For developer/Node.js

(Node.js)파일처리 관련(1)

프린이0218 2020. 9. 6. 22:35

 

var fs = require('fs');

 

fs.메소드

 

readFile(filename,[encoding],[callback]) => 비동기식 IO로 파일을 읽어 들입니다.

 

readFileSync(filename,[encoding]) => 동기식 IO로 파일을 읽어 들입니다.

 

writeFile(filename,data,encoding='utf8',[callback]) => 비동기식 IO로 파일을 씁니다.

 

writeFileSync(filename,data,encoding='utf8') => 동기식 IO로 파일을 씁니다.

 

 

-파일 읽기 예제-

var fs = require('fs');

//파일을 동기식 IO로 읽어 들입니다.
var data = fs.readFileSync('./package.json','utf8');


//읽어 들인 데이터를 출력합니다.
console.log(data);

-파일 쓰기 예제-

var fs = require('fs');

//파일에 데이터를 씁니다.
fs.writeFile('./output.txt','Hello World!',function(err){
    if(err){
        console.log('Error : '+err);
    }
    
    console.log('output.txt 파일에 데이터 쓰기 완료.');
});

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

메소드 이름 설명
open(path,flags,[mode],[callback]) 파일을 엽니다.
read(fd,buffer,offset,length,position,[callback]) 지정한 부분의 파일 내용을 읽어 들입니다.
write(fd,buffer,offset,length,position,[callback]) 파일의 지정한 부분에 데이터를 씁니다.
close(fd,[callback]) 파일을 닫아 줍니다.

 

fs.write

var fs = require('fs');

//파일에 데이터를 씁니다.
fs.open('./output.txt','w',function(err,fd){
    console.log('1');
   if(err)  throw err;
    
    var buf = new Buffer('안녕\n');
    fs.write(fd,buf,0,buf.length,null,function(err,written,buffer){
        if(err) throw err;
        
        console.log(err,written,buffer);
        
        fs.close(fd,function(){
        console.log('파일 열고 데이터 쓰고 파일 닫기 완료');
        });
    });
});

순서 : open -> write -> close

 

-open작업시에 필요한 flag-

플래그 설명
r 읽기에 사용하는 플래그입니다. 파일이 없으면 예외가 발생합니다.
w 쓰기에 사용하는 플래그입니다. 파일이 없으면 만들어지고 파일이 있으면 이전 내용을 모두 삭제합니다.
w+ 읽기와 쓰기에 모두 사용하는 플래그입니다. 파일이 없으면 만들어지고 파일이 있으면 이전 내용을 모두 삭제합니다.
a+ 읽기와 추가에 모두 사용하는 플래그 입니다. 파일이 없으면 만들어지고 있으면 이전 내용에 새로운 내용을 추가합니다.

 

fs.read

var fs = require('fs');

//파일에서 데이터를 읽어 들입니다.
fs.open('./output.txt','r',function(err,fd){
   if(err) throw err;
    
    var buf = new Buffer(10);
    console.log('버퍼 타입 : %s'+Buffer.isBuffer(buf));
    
    fs.read(fd,buf,0,buf.length,null,function(err,byteRead,buffer){
        if(err) throw err;
        
        var inStr = buffer.toString('utf8',0,byteRead);
        console.log('파일에서 읽은 데이터 :%s',inStr);
        
        console.log(err,byteRead,buffer);
        
        fs.close(fd,function(){
           console.log('output.txt 파일을 열고 읽기 완료.') ;
        });
    });
});

 

-버퍼 복사 및 이어붙기-

//버퍼 객체를 크기만 지정하여 만든 후 문자열을 씁니다.
var output = '안녕 1!';
var buffer1 = new Buffer(10);
var len = buffer1.write(output, 'utf8');
console.log('첫 번째 버퍼의 문자열 : %s',buffer1.toString());

//버퍼 객체를 문자열을 이용해 만듭니다.
var buffer2 = new Buffer('안녕 2!','utf8');
console.log('두 번째 버퍼의 문자열 : %s',buffer2.toString());

//타입을 확인합니다.
console.log('버퍼 객체의 타입 : %s',Buffer.isBuffer(buffer1));

//버퍼 객체에 들어 있는 문자열 데이터를 문자열 변수로 만듭니다.
var byteLen = Buffer.byteLength(output);
var str1 = buffer1.toString('utf8',0,byteLen);
var str2 = buffer2.toString('utf8');

//첫 번째 버퍼 객체의 문자열을 두 번째 버퍼 객체로 복사합니다.
buffer1.copy(buffer2,0,0,len);
console.log('두 번째 버퍼에 복사한 후의 문자열: %s',buffer2.toString('utf8'));

//두 개의 버퍼를 붙여 줍니다.
var buffer3 = Buffer.concat([buffer1,buffer2]);
console.log('두 개의 버퍼를 붙인 후의 문자열 : %s',buffer3.toString('utf8'));

 

-스트림 단위로 파일 읽고 쓰기-

메소드 이름 설명
createReadStream(path,[options]) 파일을 읽기 위한 스트림 객체를 만듭니다.
createWriteStream(path,[options]) 파일을 쓰기 위한 스트림 객체를 만듭니다.

 

var fs = require('fs');

var infile = fs.createReadStream('./output.txt',{flags:'r'});
var outfile = fs.createWriteStream('./output2.txt',{flags:'w'});

infile.on('data',function(data){
   console.log('읽어 들인 데이터',data) ;
    outfile.write(data);
});

infile.on('end',function(){
    console.log('파일 읽기 종료.');
    outfile.end(function(){
        console.log('파일 쓰기 종료.');
    });
});

 

-pipe를 사용하여 기존파일 복사하기-

var fs = require('fs');

var inname = './output.txt';
var outname = './output2.txt';

fs.exists(outname,function(exists){
   if(exists) {
       fs.unlink(outname,function(err){
           if(err) throw err;
           console.log('기존파일 ['+outname+'] 삭제함.');
       });
   }
    var infile = fs.createReadStream(inname,{flags:'r'});
    var outfile = fs.createWriteStream(outname,{flags:'w'});
    infile.pipe(outfile);
    console.log('파일복사 ['+inname+'] ->['+outname+']');
});

 

붙혀넣을 파일이 존재한다면 unlink를 사용하여 삭제시킨후 그다음 단계 진행

 

-http 모듈로 요청받은 파일 내용을 읽고 응답하기-

var fs = require('fs');
var http = require('http');
var server = http.createServer(function(req,res){
   //파일을 읽어 응답 스트림과 pipe()로 연결합니다.
    var instream = fs.createReadStream('./output.txt');
    instream.pipe(res);
});

server.listen(7001,'127.0.0.1');

 

-fs 모듈로 새 디렉터리 만들고 삭제하기-

var fs = require('fs');
fs.mkdir('./docs',0666,function(err){
    if(err) throw err;
    console.log('새로운 docs 폴더를 만들었습니다.');
    
    fs.rmdir('./docs',function(err){
        if(err) throw err;
        console.log('docs 폴더를 삭제했습니다.');
    });
});