FrontPage › 파일분할프로그램
//============================================================================ // Name : ChoboSplit.cpp // Author : chobocho.com // Version : // Copyleft // Description : File Spliter //============================================================================ #include <iostream> #include <fstream> using namespace std; #define _10MB (10*1024*1024) class CSplit { public: CSplit(); ~CSplit(); bool split(char *fileName); void make_batch_file (char *fileName, int count); private: fstream source_fp; fstream target_fp; }; CSplit::CSplit() { } CSplit::~CSplit() { source_fp.close(); target_fp.close(); } bool CSplit::split(char *fileName) { int nof_target = 0; int count = 0; int read_size = 4096; char buffer[4096]; string target_filename = fileName; target_filename += ".sh"; source_fp.open(fileName, ios::binary|ios::in); target_fp.open(target_filename.c_str(), ios::binary|ios::out|ios::trunc); if ( !source_fp ) { cout << "Error : Can't find " << fileName << " !!" << endl; return false; } source_fp.seekg(0, ios_base::end); long source_filesize = source_fp.tellg(); cout << "source file size : " << source_filesize << endl; source_fp.seekg(ios_base::beg); if ( !target_fp ) { cout << "Error : Can't open target file !!" << endl; return false; } while(( !source_fp.eof() )&& (source_filesize > 0) ) { memset(buffer, 0, 4096); if (source_filesize < read_size) { read_size = source_filesize; } source_fp.read( buffer, read_size ); target_fp.write( buffer, read_size ); count += read_size; source_filesize -= read_size; if (count >= _10MB) { count = 0; target_fp.close(); cout << "Make " << nof_target+1 << " file!" <<endl; char next_target_filename[256]; sprintf( next_target_filename, "%s.s%d", fileName, nof_target++ ); target_fp.open(next_target_filename, ios::binary|ios::out|ios::trunc); if (!target_fp) { source_fp.close(); cout << "Error : Can't open target file !!" << endl; return false; } } } source_fp.close(); target_fp.close(); make_batch_file (fileName, nof_target); return true; } void CSplit::make_batch_file (char *fileName, int count) { int i = 0; ofstream target("run.bat", ios::out); target << "echo off" << endl; target << "copy /b "<< fileName <<".sh "; for (i = 0; i < count ; i++) { target << "+ " << fileName << ".s" << i; } target << " " << fileName << endl; target << "echo Finish" <<endl; target.close(); } int main(int argc, char **argv) { CSplit mySplit; cout << "!!!Chobo Spilt V0.01!!!" << endl; if (argc >= 2) { mySplit.split(argv[1]); } cout << "!!!End!!!" <<endl; return 0; }
실행 결과 : run.bat + 분할된 파일들
합치는 방법 : run.bat 실행