[NodeJS] File System

2017. 11. 16. 11:26JavaScript/NodeJS

파일 시스템은 fs 모듈을 로딩함으로 사용할 수 있다.


var fs = require("fs");


node.js는 유닉스 개발자가 개발한걸로 알려졌서 그런지 모듈의 대부분 메소드가 유닉스의 명령어와 비슷한 듯 하다.


수 많은 메소드들이 있지만 주로 사용하게 될 몇 가지만 확인해 보도록 한다.


나머지는 API를 참고 하며 진행해야 할 듯...ㅡㅡ;;


모든 파일 시스템은 동기와 비동기를 지원한다.


예를 들어 


fs.readFile("D:\\temp\\out.log", function(err, data) { ... } );


는 비동기 이지만


fs.readFileSync("D:\\temp\\out.log");


는 동기 형식으로 거의 대부분의 메소드에서 Sync를 붙여 동기식으로 구현이 가능하다.


하지만 나는 비동기 형식만 여기에 작성할 것이다.



1. fs.stat(file, callback);


파일의 상태 정보를 확인한다.


callback :

err<Error> : 에러 정보

stats<Stats> : 상태 정보 


fs.stat("D:\\temp\\out.log", (err, stats) => {


if( err ) { throw err; }


console.log( stats );             // 파일 정보

console.log( "isFIle : " + stats.isFile() );     // 파일 여부

console.log( "isDirectory : " + stats.isDirectory() );     // 디렉토리 여부

console.log( "isBlockDevice : " + stats.isBlockDevice() );     // 블럭타입의 기기 여부

console.log( "isCharacterDevice : " + stats.isCharacterDevice() );  // 문자타입의 기기 여부

console.log( "isSymbolicLink : " + stats.isSymbolicLink() );           // 심볼릭 링크 여부

console.log( "isFIFO : " + stats.isFIFO() );     // FIFO(유닉스 네임드 파이프) 여부

console.log( "isSocket : " + stats.isSocket() );     // 도메인 소켓 여부


} );


결과 


Stats {

  dev: 3296761668,

  mode: 33206,

  nlink: 1,

  uid: 0,

  gid: 0,

  rdev: 0,

  blksize: undefined,

  ino: 5348024557619625,

  size: 0,

  blocks: undefined,

  atimeMs: 1499646197248.9653,

  mtimeMs: 1510624392877.0774,

  ctimeMs: 1510624392877.0774,

  birthtimeMs: 1499646197248.9653,

  atime: 2017-07-10T00:23:17.249Z,

  mtime: 2017-11-14T01:53:12.877Z,

  ctime: 2017-11-14T01:53:12.877Z,

  birthtime: 2017-07-10T00:23:17.249Z }

=============================================================

isFIle : true

isDirectory : false

isBlockDevice : false

isCharacterDevice : false

isSymbolicLink : false

isFIFO : false

isSocket : false



2. fs.rename(source, target, callback);


파일명을 변경한다.


callback :

err<Error> : 에러 정보


fs.rename("D:\\temp\\out.log", "D:\\temp\\output.log", (err) => {

if( err) throw err;


fs.stat("D:\\temp\\output.log", (err, stats) => {

if( err) throw err;

console.log( stats );

});

});


결과는 파일 명을 변경하고 해당 파일 명의 정보를 출력한다.



3. fs.exists(file, callback);


파일의 존재 여부를 확인한다.


callback :

exists<Boolean> : 존재 여부

fs.exists("D:\\temp\\output.log", (exists) => {

console.log( exists ? "있음" : "없음" );

});



4.  fs.appendFile(file, data, callback);


파일에 내용을 추가한다.

파일이 존재하지 않을 경우 파일을 생성한다.


callback :

err<Error> : 에러 정보


fs.appendFile("D:\\input.txt", "Data to append....", (err) => {

if( err ) {

console.error(err);

return;

}


console.log("Data 추가 완료");

});



5. fs.open(file, flags[, mode], callback)


파일을 오픈할 때 사용된다. 


flags :


r        - 파일을 읽는다. 파일이 없을 경우 예외 발생

r+      - 파일을 읽고 쓴다, 파일이 없을 경우 예외 발생

w       - 파일을 쓴다. 파일이 없는 경우 생성하고 있는경우는 덮어 씌운다.

wx      - w와 비슷하지만 파일이 있는경우 실패한다.

w+     - 파일을 읽고 쓴다. 파일이 없는 경우 생성하고 있을경우 덮어 씌운다.

wx+    - w+와 비슷하지만 파일이 있는경우 실패한다.

a        - 파일을 추가한다. 파일이 없는 경우 생성한다.

ax      - a와 비슷하지만 파일이 있는경우 실패한다.

a+      - 파일을 읽고 추가한다. 파일이 없으면 생성한다.

ax+    - a+와 비슷하지만 파일이 없는 경우 실패한다.


callback :

err<Error> :   에러 정보

fd<integer> :  타입의 결과값  



fs.open("D:\\temp\\out.log", "wx", (err, fd) => {

if( err ) {


if( err.code == "ENOENT" ) {

console.error( "파일이 존재하지 않음.");

return;

} else if( err.code = "EEXIST" ) {

console.error( "이미 파일이 있습니다.");

return;

}


throw err;

}


console.log( fd );

});



6. fs.readFile(file[, options], callback)


파일 내용을 읽는다.


callback :

err<Error> : 에러정보

data<String|Buffer> : 파일 내용


나는 input.txt 라는 파일 생성하고 내용에 "Test File System.."이라고 입력 후 저정하였다.


옵션 없이 실행할 경우와 있는 경우의 data 값은 다르게 출력이 된다.

옵션이 없는 경우 기본적으로 인코딩되어 출력이 된다.



// 옵션이 없는 경우

fs.readFile("D:\\input.txt", (err, data) => {

if( err ) {

console.error("read file error : " + err );

return;

}


console.log( data );

});


결과 :


<Buffer 54 65 73 74 20 46 69 6c 65 20 53 79 73 74 65 6d 2e 2e>


//옵션이 있는 경우

fs.readFile("D:\\input.txt", "utf8", (err, data) => {

if( err ) {

console.error("read file error : " + err );

return;

}


console.log( data );

});


결과 :


Test File System..



7. fs.writeFile(file, data[, options], callback)


파일을 쓴다.


callback :

err<Error> : 에러 정보


fs.writeFile("D:\\test.txt", "hello world", (err) => {

if( err ) {

console.error("write file error : " + err );

return;

}


console.log("write completed..");

});


결과 :


write completed..


파일을 읽거 나 쓸 경우 위의 방식이 아닌 fis.open()을 사용하고 fs.read() 와 fs.write()를 사용할 수 있다.


파일 읽기 :


fs.open("D:\\test.txt", "r", (err, fd) => {


if( err ) {

console.error("open error : " + err );

return;

}


var buf = new Buffer(5);

fs.read(fd, buf, 0, buf.length, null, (err, byteRead, buffer) => {


if( err ) {

console.error("read error : " + err );

return;

}


console.log( err, byteRead, buffer);


fs.close(fd, () => {

console.log( "Done." );

});

});

});


결과 :


null 5 <Buffer 61 64 64 20 44>

Done.


파일 쓰기 :


fs.open("D:\\test.txt", "w", (err, fd) => {

if( err ) {

console.error("open error : " + err );

return;

}


var buf = new Buffer("add Data...\n");

fs.write(fd, buf, 0, buf.length, null, (err, written, buffer)=> {

if( err ) {

console.error("write error : " + err );

return;

}


console.log( err, written, buffer);


fs.close(fd, () => {

console.log( "Done." );

});

} );


});


결과 :


null 12 <Buffer 61 64 64 20 44 61 74 61 2e 2e 2e 0a>

Done.


맘은 더 쓰고 싶은데...ㅡㅡ

귀찮다.. 나머지는 찾으면서~~