오늘은 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-treelet tree = dirTree(dirPath, { attributes: ["size", "type", "extension"] });