/** * @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));