Back Ground

NodeJS - 파일 읽고 쓰기 [ES5] 본문

Javascript/Node.js

NodeJS - 파일 읽고 쓰기 [ES5]

Back 2018. 9. 14. 11:40




노드의 파일 시스템


파일관리 모듈을 불러와 사용한다.

1
var fs = require('fs');
cs


동기식 IO와 비동기식 IO를 모두 제공해주는데

- 동기식 IO는 작업이 끝날 때까지 대기한다는 점에 주의한다.






파일 읽기 ( readFileSync / readFile )



동기식 IO 메소드 [ readFileSync() ]

.readFileSync('노드가 실행되는 경로','인코드');

이런식으로 사용이 가능하다.


예제)

1
2
3
4
var fs = require('fs');
 
var data = fs.readFileSync('./study/day_04/aaa.txt','utf8');
console.log(data);
cs

- return값은 해당 파일(aaa.txt)의 값을 갖고 있다.







비동기식 IO 메소드 [ readFile() ]

 readFile('노드가 실행되는 경로','인코드',콜백함수(에러,데이터) )

이런식으로 사용이 가능하다.


예제)

1
2
3
4
5
6
7
8
9
10
var fs = require('fs');
 
fs.readFile('./study/day_04/aaa.txt','utf8',function(err, data){
    console.log("파일 다 읽었음");
    console.log(data);
});
 
 
console.log('끝났음');
 
cs

- callback함수를 실행 해 readFile은 비동기방식으로 처리되는것을 알수있다.

- readFileSync와 다르게 return값이 없다 

- 대신 콜백을 통해 aaa.txt의 data를 받을 수 있다.


결과 :

Command: node "F:/study/node_study/day_04/04_readFile.js"
끝났음
파일 다 읽었음 
undefined


결과를 보면 

> 끝났음  

이 먼저 실행되고 

> 파일 다 읽었음

이 후에 실행 된 것을 알수있다.


setTime아웃 처럼 파일을 다 끝난후 읽는데

파일읽는것에 대기 상관없이 진행된다. (로그인 프로그레스바 같은 것 만들때 유용하다.)







경로 지정시 주의 사항


현재 이 코드와 aaa.txt가 있는 위치는 

studys/study/day_04 이 곳이다.


주의 해야 하는 사항

js파일의 경로가 아닌 node가 실행되는 위치이다.

현재 brackets 에디터로 작업 하면서 폴더 경로위치를  studys 로 잡았기 때문에

저런 경로를 실행하게 되었다.


만약 CMD로 작업을 할 시  

\studys\study\day_04>node test.js (예제 코드가 있는 js 파일)

에러가 뜰 것이다.


node가 실행되는 위치는 day_04에서 실행했지만

js에서 잡은 경로가 다르기 때문에 이럴 경우


현재 node가 어디에서 실행되는지 패스를 가져온후 작업을 해야 된다.

(그러지않으면.. 배포할때마다.. 경로를 수정하는 미친짓이 발생할 테니.. )





파일 쓰기 ( writeFileSyncwriteFile)



파일쓰기 또한 읽기와 동일하다


동기 방식/ 비동기 방식 으로 나눠져있다


writeFileSync 동기방식

writeFileSync(filename, data, encoding)  




writeFile 비동기방식

writeFile(filename, data, encoding, callback(에러,데이터) )  

이런식으로 되어져있다.


1
2
3
4
5
6
7
8
var url= './study/day_04/img/';
var fileName='aaa.txt';
var encoding = 'utf8';
 
 fs.writeFile(url+fileName,data,encoding,function(err){
       if(err) console.log('Error'+err);
       else console.log("쓰기완료");
 });
cs


이랬을 경우 안에 있던


그리고 유의해야 할 사항으로는 현재 aaa.txt는 텍스트 파일이지만


jj.jpg 라는 이미지 파일이 있을때 문제가 생긴다.


그 이유는 endoing때문에 그런데 이미지파일을 utf8로 인코딩해서 파일이 손상되기 때문에 

파일이 무엇 인지에 따라서 적용시켜야 된다.

(node는 기본 utf8로 되어져있다.)


그래서 encoding을 빼고 넣거나 null 로 넣어주어야 된다.


1
2
3
4
5
6
7
8
var url= './study/day_04/img/';
var fileName='jj.jpg';
var encoding = null;
 
 fs.writeFile(url+fileName,data,encoding,function(err){
       if(err) console.log('Error'+err);
       else console.log("쓰기완료");
 });
cs



읽기 쓰기와 같이 응용해서 

복사를 한다고하면 


1
2
3
4
5
6
7
8
9
10
11
12
13
var url= './study/day_04/img/';
var fileName='jj.jpg';
var encoding = null;
 
fs.readFile(url+fileName,encoding,function(err,data){
    
    fileName='ii.jpg';
    fs.writeFile(url+fileName,data,encoding,function(err){
        if(err) console.log('Error'+err);
        else console.log("쓰기완료");
    });
    
});
cs


이런식으로 만들어서 응용하면 될 것 같다.


Comments