js-common-code/src/script/archiveFiles.js
2025-03-20 21:56:10 +09:00

129 lines
3.8 KiB
JavaScript

/**
* @requires archiver
* - npm install archiver
* @example
* node src/script/archiveFiles.js data output.zip
*/
const archiver = require('archiver');
const fs = require('fs');
const path = require('path');
const TimeWatch = require('../classes/TimeWatch');
/**
* 特定のディレクトリからzipファイルを作成する
*
* @param {*} sourceDir
* @param {*} outputFilePath
* @returns
*/
const createZipFile = (sourceDir, outputFilePath) => {
return new Promise((resolve, reject) => {
const output = fs.createWriteStream(outputFilePath);
const archive = archiver('zip', {
zlib: { level: 9 } // 圧縮レベル
});
output.on('close', () => {
console.log(`ZIPファイル作成完了: ${outputFilePath}`);
resolve();
});
archive.on('error', (err) => {
reject(err);
});
archive.pipe(output);
archive.directory(sourceDir, false);
archive.finalize();
});
};
/**
* ディレクトリのサイズを測定する
* @description デバッグ用途で本番ではコメントアウトする
* @param {*} dir
* @returns
*/
const _debugDirectorySize = (dir) => {
let size = 0;
const files = fs.readdirSync(dir);
for (let file of files) {
const filePath = path.join(dir, file);
const stat = fs.statSync(filePath);
if (stat.isFile()) {
size += stat.size;
} else if (stat.isDirectory()) {
size += _getDirectorySize(filePath);
}
}
// デバッグ用にサイズを表示する
if (size < 1000) {
// 1000バイトまでの場合はbytesで表示する
console.log(`Directory: ${dir}, Size: ${size} Biytes`);
} else if(size < 1000000) {
// 1000バイト以上、1000000バイト未満の場合はKBで表示する 小数点は第2位まで表示する
console.log(`Directory: ${dir}, Size: ${Math.round(size / 1000 * 100) / 100} KB`);
} else if(size < 1000000000) {
// 1000000バイト以上、1000000000バイト未満の場合はMBで表示する 小数点は第2位まで表示する
console.log(`Directory: ${dir}, Size: ${Math.round(size / 1000000 * 100) / 100} MB`);
} else {
// 1000000000バイト以上の場合はGBで表示する 小数点は第2位まで表示する
console.log(`Directory: ${dir}, Size: ${Math.round(size / 1000000000 * 100) / 100} GB`);
}
return size;
};
/**
* エントリーポイント
*
* @function main
* @param {string[]} args - コマンドライン引数 (process.argv を除いたもの)
* @returns {void}
*
* @example
* // フォルダ data を output.zip に圧縮する
* node src/script/archiveFiles.js csv_output output.zip
*
*/
const main = (args) => {
if (args.includes('--help')) {
console.log(`
Usage: node archiveFiles.js [sourceDir] [outputFile]
args:
sourceDir : 圧縮するディレクトリ
outputFile : 出力ファイル名
Options:
--help ヘルプを表示
`);
return
}
// 引数が2つ以外の場合はエラー
if (args.length !== 2) {
console.error('エラー: 引数が正しくありません。');
console.error('Usage: node script.js [sourceDir] [outputFile]');
return;
}
const sourceDir = args[0];
// ファイルの存在チェック
if (!fs.existsSync(sourceDir)) {
console.error(`エラー: ディレクトリが存在しません: ${sourceDir}`);
return;
}
const outputFilePath = args[1];
// prodモード以外の場合は表示する
if(process.env.NODE_ENV !== 'production') _debugDirectorySize(sourceDir);
const timeWatch = new TimeWatch();
timeWatch.start();
createZipFile(sourceDir, outputFilePath);
timeWatch.stop();
timeWatch.printElapsedTime();
}
console.log(`start ${process.argv[1]}`);
main(process.argv.slice(2));