node.js를 이용한 파일시스템 다루기

넘치는 일과 결혼 준비 때문에 포스팅 할 시간이 도저히 나지 않아, 어떻게든 퇴근 후 시간을 내서 그냥 기록 겸, 매우 가벼운 이야기지만 기록을 위해서라도 하나의 글을 오랜만에 남기기로 했습니다.

우선 node.js를 이용해서, 파일 시스템 내의 특정 파일들에 대해, A라는 이름을 가진 파일은 a로, B라는 이름을 가진 파일은 b로 변경해야하는 요구사항이 있어, 그에 대해 고민을 해 보고는 node.js의 fs모듈을 이용해서 처리해보자! 하는 결론을 내리고 방법을 찾아 보게 됐습니다.

우선, node.js의 내장 모듈인 fs는 현재 운영체제의 파일시스템에 대한 처리를 담당하는 모듈로써, 해당 모듈의 API에 대해서는 다음 페이지에서 확인할 수 있습니다.

https://nodejs.org/api/fs.html

뭐 클래스부터 여러 메소드들이 있는데, 저 같은 경우는 다음의 조건에 맞는 api만 사용했으면 됐습니다.

1. 주어진 파일 리스트만큼 반복하면서 | for(…)
2. 각각의 파일이 존재하는지 찾아서 | fs.readFileSync( originalFileName, encodingType );
3. 파일이 존재하면 그 파일에 대한 다른 이름의 복사본을 생성한 뒤, 성공 목록에 파일명을 추가하고 | fs.createReadStream( originalFileName ).pipe(fs.createWriteStream( changedFileName )); | successList.push( originalFileName );
4. 존재하지 않는 경우 실패 목록에 그 파일명을 추가한다. | failedList.push( originalFileName );
5. 2~4를 반복하며 생성된 성공/실패 목록을 YYYY-MM-DD-millis.txt 형태의 report파일로 생성한다. | fs.writeFileSync( reportFileName, reportFile, encodingType );

1번의 주어진 파일 리스트는 DB같은 곳으로부터 추출해서 정비를 했습니다.
2번은 반복을 취하면서 필요한 파일을 읽음 시도 하면서 읽지 못하는 경우 복사가 되지 않을 파일이므로 4번으로 catch되도록 하였고, 통과하는 경우 3번에서 복사 처리 후 성공 목록에 추가되도록 했습니다.
4번에서는 실패한 경우 실패 목록에 추가 처리를 하였으며
5번에서는 최종 로깅 파일을 파일시스템 내 파일로 작성되도록 하였습니다.

전체 코드는 다음과 같았습니다.

const fs = require("fs");

// 변경 대상 파일 목록 - protocol => { "file": { "fileName" : "원본파일명",  "fileId" : "바꿀파일명"} },
const targetFileList = require("./targetFileList.json");
const encodingType = "UTF-8";

let successList = [];
let failedList = [];

let file, originalFileName, changedFileName;
for( let key in targetFileList ){
    const obj = targetFileList[key]; 
    
    for( let prop in obj ){
        originalFileName = obj[prop].fileName;
        changedFileName = obj[prop].fileId; 
        
        try {
            file = fs.readFileSync( originalFileName, encodingType );

            //위 과정에서 예외 처리 되지 않았다면 존재하는 파일.
            fs.createReadStream(originalFileName).pipe(fs.createWriteStream(changedFileName));
            
            successList.push( originalFileName );
        } catch( err ) {
            failedList.push( originalFileName );
        }
    }
}

//결과를 log파일로 작성한다.
const currentDate = new Date();
const processDate = currentDate.toLocaleString().split(" ");
const millis = currentDate.getTime();

//결과 파일명 및 파일 내용
const reportFileName = processDate[0] + "-" + millis + ".txt";
const reportFile = 
    "successList : [" + successList + "]\n" + 
    "failedList : [" + failedList + "]\n" + 
    "successCounts :" + successList.length + "\n" + 
    "failedCounts : " + failedList.length;

//파일 작성
fs.writeFileSync( reportFileName, reportFile, encodingType );

내장 모듈 외 다른 파일 사용 없이 간단한 요구사항이 발생하는 경우, 위처럼 간단하게 처리할 수 있을 것입니다.

너무 오랫동안 포스팅을 하지 않아서 매우 간단한거지만 어떻게든 남겨보겠다고 작성을… -_-;;

You may also like...

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.