Migration Document - 모든 경로 및 압축풀기 ( fs, jszip )

juhojung·2022년 2월 22일
0

nodejs

목록 보기
2/6

오늘은 unzip in folder 함수를 만든 기록을 작성해보려 한다.

migration 발단은 이렇다

??? : OO님 특정문서들을 시스템에 안착시켜야 하는데, window server 에 폴더 에 정리되있어요!
그거 다 마이그레이션 해야해요!

솔직히 귀찮고 그냥 손수 넣으면 안될까 했는데, 폴더는 5000개를 넘어가고
파일은 폴더당 10개이상; 귀찮다

그리고 폴더 안에있는 실적파일들은 압축파일로 존재했다.
선제적으로 압축파일을 압축해제하는 코드를 작성해봤다.

모든 폴더 및 파일 경로를 확인

result_types = []; // 0 : File, 1 : Directory
results = []; // 경로 string[]
const _getAllFilesFromFolder = (dir: string) => {
    fs.readdirSync(dir).forEach(file => {
        file = dir + "/" + file;
        var stat = fs.statSync(file);
        if (stat && stat.isDirectory()) {
          result_types.push(1);
          results.push(file);
          _getAllFilesFromFolder(file);
        } else {
          result_types.push(0);
          results.push(file);
        }
    });

    return results;
};

위와 같이하면 results 에는 폴더경로와 파일경로가, result_types 에는 폴더인지 파일인지 플래그가 return 된다.

필자는 리스트의 index 로 파일경로와 폴더경로를 구분하였다.
리스트로 굳이 만든 이유는 어느폴더 안에있는지 따로 작성하기 귀찮았기때문이다.

경로 가져오는것은 만들었으니 이제 압축해제 해보자.

import fs from "fs";
import JSZip from "jszip";
import il from "iconv-lite";
~~~~~~
~~~~~~
const unzipInFolder = async (_path: string) => {
    let results = _getAllFilesFromFolder(_path); // 경로 Get

    for (var i = 0; i < results.length; i++) {
        let p = results[i];
        if (result_types[i] == 0 && p.indexOf(".zip") != -1) { // zip 파일 구분
            await new Promise(async r => {
                fs.readFile(p, async (err, data) => { // zip 파일 읽기
                    if (!err) {
                        var zip = new JSZip();
                        let contents = await zip.loadAsync(data, {
                            decodeFileName: function (bytes) {
                                return il.decode(bytes, "euc-kr");
                            },
                        }); // decodeFileName 은 한글 제목을 decode 하기위해서이다.
                        for (var filename of Object.keys(contents.files)) {
                            if (filename && filename[filename.length - 1] != "/") {
                                let content = await zip.file(filename).async("nodebuffer");
                                let dest = path.resolve(p, "../", filename);
                                fs.writeFileSync(dest, content, { encoding: "utf-8" }); // 파일을 폴더에 write
                            }
                        }
                        r(true);
                    }
                });
            });
        }
    }
};

압축 해제하는 프로세스는
1. 압축파일 loadAsync ( jszip )
2. Zip Files Loop
3. file to nodebuffer ( jszip )
4. write file ( fs )
이렇게 진행된다.

두개 코드 결합하면 특정경로의 모든 압축 파일 풀기 끝.
안녕👋

2022-03-10 Update
훨씬 간편하게 쓸 수 있는 directory-tree 라이브러리 추천
https://www.npmjs.com/package/directory-tree

let tree = dirTree(dirPath, { attributes: ["size", "type", "extension"] });
profile
"어찌 할 수 없는 일에 대해 고민하는 시간은 낭비일 뿐이다."

0개의 댓글