E D R S I H C RSS

파일분할프로그램 (rev. 1.1)

ID
Password
Join
You will gain money by a speculation or lottery.

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 실행
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 23:06:36
Processing time 0.4241 sec