반응형

1. 경로다루기


경로 다루기 : path

var pathUtil = require(‘path’);


path 모듈 : 파일 경로 다루기

 경로 정규화

 경로 생성

 디렉토리/파일 이름 추출

 파일 확장자 추출 


1)경로 정보


현재 실행 파일 경로, 폴더 경로



전역 객체(global)

 __filename

 __dirname


같은 폴더 내 이미지 경로

 var path = __dirname + '/image.png';


2) 경로 다듬기


경로 다듬기


 path.normalize() 


경로 구성

 ‘..’ : 부모 폴더

 ‘.’ : 같은 폴더


예제

pathUtil.normalize(‘/user/tmp/../local///bin/');

// returns

/user/local/bin/ 


3) 경로 구성요소 


-경로 구성 요소 얻기

 path.basename() : 파일 이름, 경로 중 마지막 요소

 path.dirname() : 파일이 포함된 폴더 경로

 path.extname() : 확장자 


예제

var path = '/foo/bar/baz/asdf/quux.html';


// /foo/bar/baz/asdf

pathUtil.dirname(path);

// quux.html

pathUtil.basename(path);

// .html

pathUtil.extname(path); 


-경로 구성 객체

var info = path.parse('/home/user/dir/file.txt')

{

  root : "/",

  dir : "/home/user/dir",

  base : "file.txt",

  ext : ".txt",

  name : "file"

}

// 구성 요소 얻기

info.base

info.name 

4)경로 만들기

 pathUtil.sep

 pathUtil.join()

 pathUtil.format()


-경로 연산

 __dirname +pathUtil.sep + ‘image.png';

 현재 폴더 내 image.png

  

   -경로 붙이기

 path.join

   pathUtil.join('/foo', 'bar', 'baz/asdf', 'quux', '..')

   // returns

‘ /foo/bar/baz/asdf


   -경로 만들기

path.format

var path = pathUtil.format({

  root : "/",

  dir : "/home/user/dir",

  base : "file.txt",

  ext : ".txt",

  name : "file"

});

'/home/user/dir/file.txt'



2.파일 시스템 다루기


파일 시스템 다루기

-파일 시스템 모듈 : fs

var fs = require(‘fs’);

-주요 기능

파일 생성/읽기/쓰기/삭제

파일 접근성/속성

디렉토리 생성/읽기/삭제

파일 스트림


주의 : 모든 플랫폼에 100% 호환되지 않음 



-fs 모듈의 특징

-특징

 비동기와 동기 방식 함수 모두 제공

   

   비동기식 동기식

 callback 사용 이름 규칙 : +Sync

   논-블럭 방식          ( readFileSync )

블록(block) 방식 - 성능상 주의

반환값 이용 


비동기

 fs.readFile('textfile.txt', 'utf8',

function(error, data) {

});


동기

var data =

fs.readFileSync('textfile.txt',

'utf8'); 



동기식과 비동기식 API 에러 처리 방법

 -동기식 : try~catch 사용

try {

 var data = fs.readFileSync('none_exist.txt', 'utf-8');

}

catch ( exception ) {

 console.error('Readfile Error : ', exception);

}




2)파일 다루기

파일 다루기

 파일 디스크립터

 파일 경로

FileDescription로 파일 다루기

fs.read(fd, buffer, offset, length, position, callback)

fs.readSync(fd, buffer, offset, length, position)

파일 경로로 파일 다루기

fs.readFile(filename[, options], callback)

fs.readFileSync(filename[, options])


-비동기식 : 콜백 함수의 에러 파라미터 사용

fs.readFile('none_exist.txt', 'utf-8', function(err, data) {

 if ( err ) {

 console.error('Readfile error ', err);

 }

 else {

 // 정상 처리

 }

});



--파일 디스크립터

FileDescription 얻기 : open 함수

var fd = fs.openSync(path, flags[, mode])

fs.open(path, flags[, mode], function(err, fd) {

});

flag

 r(읽기), w(쓰기), a(추가), ..

파일 닫기

fs.close(fd, callback)

fs.closeSync(fd)



--파일 읽기

파일 내용 읽기

fs.read(fd, buffer, offset, length, position, callback)

fs.readFile(filename[, options], callback)

fs.readFileSync(filename[, options])

파일 종류

 문자열 읽기 : 인코딩

 바이너리 읽기 : buffer

인코딩 설정 안하면 - buffer



파일 읽기 예제

(1)파일 읽기 예제 - 파일 디스크립터, 동기식

var fd = fs.openSync(file, 'r');

var buffer = new Buffer(10);

var byte = fs.readSync(fd, buffer, 0, buffer.length, 0);

console.log('File Contenst : ', buffer.toString('utf-8'));

// 파일 디스크립터 닫기

fs.closeSync(fd);



(2)파일 읽기 예제 - 파일 디스크립터, 비동기

fs.open(file, 'r', function(err, fd2) {

 var buffer2 = new Buffer(20);

 fs.read(fd2, buffer2, 0, buffer2.length, 10, function(err, byteRead,

buffer) {


 console.log('File Read ', byteRead, 'bytes');

 console.log('File Content : ', buffer.toString('utf-8'));


 fs.close(fd, function(err) {});

 });

});



  (3)파일 읽기 - 동기식

// 파일 읽기, 인코딩

console.log('File Reading, with Encoding');

var data = fs.readFileSync(file, 'utf-8');

console.log(data);

// 바이너리 파일 읽기

var imageData = fs.readFileSync('./image.jpg');

console.log('Read Image File');

console.log(imageData);


    (4)파일 읽기 : 비동기, 인코딩

fs.readFile(file, 'UTF-8', function(err, data) {

 if ( err ) {

 console.error('File Read Error : ', err);

 return;

 }

 console.log('Read Text File, UTF-8 Encoding');

 console.log(data);

});




3)파일 상태확인


파일 상태 확인

 파일 다루기 : 파일 상태에 따라서 에러 발생

 파일 다루기 전 : 파일 상태 확인



(1) 파일 존재확인하기

fs.access(Sync) 사용

fs.stat(Sync)


(2)파일 접근 상태 확인

파일 접근 가능 확인하기

fs.access(path[, mode], callback)

fs.accessSync(path[, mode])

접근 모드

 fs.F_OK : 존재 확인

 fs.R_OK, W_OK, X_OK : 읽기/쓰기/실행 여부 확인

결론

 접근 불가능하면 에러 발생 : try~catch 사용



(3)파일 접근 여부 확인 후 읽기 - 동기식

try {

 fs.accessSync(file, fs.F_OK)

 console.log('파일 접근 가능');

 var data = fs.readFileSync(file, 'utf8');

 console.log('파일 내용 : ', data);

}

catch ( exception ) {

 // 파일 없음

 console.log('파일 없음 : ', exception);

}



(4)파일 접근 여부 확인 후 읽기 - 비동기식

fs.access(file, fs.F_OK | fs.R_OK, function(err) {

 if ( err ) {

 // 에러 처리

 }

 fs.readFile(file, 'utf8', function(err, data) {

 if ( err ) {

 // 에러 처리

 }

 console.log(data);

 });

});




4)파일 상태


(1)파일 상태 얻기

fs.stat(path, callback)

fs.statSync(path)

파일 상태 : fs.stats

 파일, 디렉토리 여부 : stats.isFile(), stats.isDirectory()

 파일 크기 : stats.size

 생성일/접근/수정일 : stats.birthtime, stats.atime, stats.mtime


(2)파일 상태 확인 : 동기

try {

 var stats = fs.statSync(file)

 console.log('Create : ', stats.birthtime);

 console.log('size : ', stats.size);

 console.log('isFile : ', stats.isFile());

 console.log('isDirectory : ', stats.isDirectory());

}

catch ( err ) {

 console.error(‘파일 접근 에러', err);

}


(3)파일 상태 확인 : 비동기

fs.stat(file, function(err, stats) {

 if ( err ) {

 console.error('File Stats Error', err);

 return;

 }

 console.log('Create : ', stats.birthtime);

 console.log('size : ', stats.size);

 console.log('isFile : ', stats.isFile());

 console.log('isDirectory : ', stats.isDirectory());

}


(4)파일 상태 확인 후 읽기 -비동기

fs.stat(path, function(err, stats) {

 if ( stats.isFile() ) {

 fs.readFile(path, 'utf-8', function(err, data) {

 console.log('파일 읽기 :', data);

 });

 }

});



5)파일에 저장


(1)파일에 데이터 저장

fs.write(fd, data[, position[, encoding]], callback)

fs.writeFile(filename, data[, options], callback)

fs.writeFileSync(filename, data[, options])

파일에 데이터 저장

 fd, filename : 파일 디스크립터, 파일 경로

 data : 문자열 혹은 Buffer

 encoding : 문자열 저장 시 인코딩

같은 파일 이름 - 덮어쓰기


문자열 데이터 저장

fs.writeFile('./textData.txt', 'Hello World', function(err) {

 if ( err ) {

 console.error('파일 저장 실패 : ', err);

 return;

 }

 console.log('파일 저장 성공');

});



(2)파일에 추가

기존 파일에 내용 추가

fs.appendFile(file, data[, options], callback)

fs.appendFileSync(file, data[, options])

파일이 없으면? : 새 파일 생성

파일에 내용 추가

fs.appendFile(path, ‘Additional data', function(err) {

 if ( err ) {

 console.error('파일 내용 추가 실패 : ', err);

 }

 console.log('파일 내용 추가 성공');

});


(3)파일 삭제

파일 삭제

fs.unlink(path, callback), fs.unlinkSync

파일이 없으면 에러


파일 삭제

예제 코드

fs.unlink('./binaryData.da', function(err) {

 if ( err ) {

 console.error('Delete Error : ', err);

 }

});



(4)파일 이름 변경/이동

파일 이름 변경/이동

fs.rename(oldPath, newPath, callback)

fs.renameSync(oldPath, newPath)



6)디렉토리 다루기

(1)디렉토리 생성

 같은 이름의 디렉토리가 있으면 실패

fs.mkdir(path[, mode], callback), fs.mkdirSync

디렉토리 삭제

 디렉토리가 비어있지 않으면 실패

fs.rmdir(path, callback), fs.rmdirSync


예제 코드2(삭제)

try {

 fs.rmdirSync('test');

}

catch ( error ) {

 console.log(‘디렉토리 삭제 에러');


(2)디렉토리 내 파일 목록

fs.readdir(path, callback), fs.readdirSync

디렉토리가 없으면 에러


디렉토리 내용 읽기

fs.readdir(path, function(err, files) {

 if ( err ) {

 console.errro('디렉토리 읽기 에러');

 return;

 }

 console.log('디렉토리 내 파일 목록(Async)\n', files);

});

}


(3)파일 스트림

스트림 만들기

fs.createReadStream(path[, options])

fs.createWriteStream(path[, options])



3.버퍼

JavaScript

 문자열 다루는 기능 제공

 바이너리 데이터를 다루는 기능이 없음

Buffer : 바이너리 데이터 다루는 모듈

글로벌이므로 별도의 로딩(require) 불필요


1)버퍼 얻기

파일에서 읽기

var fileBuffer = fs.readFileSync(‘image.jpg');

네트워크에서 얻기

socket.on(‘data’, function(data) {

 // data - buffer

});


2)버퍼 만들기

생성 후 크기 변경 불가

 new Buffer(size)

 new Buffer(array)

 new Buffer(str[, encoding])


3)버퍼 다루기

-모듈 함수

 바이트 길이 - Buffer.byteLength(string[, encoding])

 비교 - Buffer.compare(buf1, buf2)

 붙이기 - Buffer.concat(list[, totalLength])

 버퍼 확인 - Buffer.isBuffer(obj)

 인코딩 - Buffer.isEncoding(encoding) 

   

-객체 메소드

   길이 - buffer.length

 채우기 - buf.fill(value[, offset][, end])

 자르기 - buf.slice([start[, end]])

 비교하기 - buf.compare(otherBuffer)

 복사하기 - buf.copy(targetBuffer[, targetStart][, sourceStart][,

sourceEnd])


4)문자열과 버퍼

  문자열 - 바이너리 데이터로 다루기

문자열에서 버퍼 생성

 new Buffer(str[, encoding])

문자열 인코딩 필요

 ascii, utf8, …

잘못된 인코딩 -> 에러

버퍼에 문자열 쓰기

 buf.write(string[, offset][, length][, encoding])

  변환

 buf.toString([encoding][, start][, end])


  --문자열에서 버퍼 생성

var strBuffer = new Buffer('Hello World');

strBuffer.toString(‘utf-8);

strBuffer.toString(‘base64'); // SGVsbG8gV29ybGQ=

버퍼에 문자열 작성

var buffer = new Buffer(10);

// 버퍼에 문자열 쓰기

buffer.write('Hello World’);

buffer.toString(); // Hello Worl


--문자열의 바이트 길이

Buffer.byteLength(string[, encoding])

예제

var str1 = ‘Hello World’;

str1.length // 11

Buffer.byteLength(str1); // 11

var str2 = ‘ ’;

str2.length // 4

Buffer.byteLength(str2); // 8


--버퍼 - 데이터 읽기/쓰기

데이터 읽기/쓰기

buf.readInt8(offset[, noAssert])

buf.writeInt8(value, offset[, noAssert])



16비트 크기의 정수형 데이터 읽고 쓰기

buf.readUInt16LE(offset[, noAssert])

buf.writeUInt16LE(value, offset[, noAssert])

실수형 데이터 읽고 쓰기

buf.writeFloatLE(value, offset[, noAssert])

buf.writeFloatBE(value, offset[, noAssert])

buf.readFloatLE(offset[, noAssert])

buf.readFloatBE(offset[, noAssert])



Endian

require('os').endianness()

버퍼 쓰기( value, offset )

buffer.writeInt8(0, 0); // 01

buffer.writeUInt8(0xFF, 1); // FF

buffer.writeUInt16LE(0xFF, 2); // FF 00

buffer.writeUInt16BE(0xFF, 4); // 00 FF



버퍼 읽기

buffer.readInt8(0) // 1

buffer.readUInt8(1) // 255

buffer.readUInt16LE(2) // 255

buffer.readUInt16BE(4) // 255

'Web development > Backend & Server' 카테고리의 다른 글

[NODE.JS]NODE.JS 5일차  (0) 2018.01.08
[NODE.JS]NODE.JS 4일차  (0) 2018.01.08
[NODE.JS]NODE.JS 2일차  (0) 2018.01.02
[Node.js]Node.js 1일차  (0) 2017.12.31
[PHP] Section 28 문자열 조작  (0) 2017.09.13
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기