129 lines
3.8 KiB
JavaScript
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)); |