でかいファイルを指定バイトに分割

送り先のメールサーバの制限で、2〜3MBを超えるファイルは送れない。
7MBぐらいだから、3通ぐらいに分ければ送れるんだけれど。
昔作ったツールです。
当時は、でかいファイルを複数のFD(1.44MB)に分けて持ち運ぶために目的で作ったけれど、今でも目的は変われど使える。

#include    <stdio.h>
#include    <stdlib.h>

#define     BUFSIZE     1024

char    data[BUFSIZE];

//  使用方法
void    usage(void)
{
    printf( "でかいファイルを指定バイトに分割します。\n");
    printf(
"   spltfile <source> <size> \n"
"<size> はバイト数で指定します。1.4MBのときには、1457667 です。\n"
"例: spltcopy abc.lzh 1457664\n"
"拡張子が 001,002,...のファイルが作成されます。また、結合するための\n"
"BATファイルも作成されます。結合の仕方は、copy /B abc.001+abc.002+... abc.lzh\n"
"です。\n");
}


int     main( int argc, char* argv[] )
{
    FILE    *fpI;
    FILE    *fpO;
    int     i,len,n, rest,size;
    char    path[_MAX_PATH];
    char    drive[_MAX_DRIVE];
    char    dir[_MAX_DIR];
    char    fname[_MAX_FNAME];
    char    ext[_MAX_EXT];

    // バージョン情報
    fprintf( stderr,"spltfile.exe ver 2.00\n" );
    fprintf( stderr,"copyright (C) 渡辺義則 1996-1999. All Rights Reserved.\n\n" );

    // 引数チェック
    if( argc != 3 ) {
        usage();
        exit( 1 );
    }
    size = atoi(argv[2]);
    if(size < 1) {
        fprintf(stderr, "サイズは1以上でなければなりません\n");
        exit(1);
    }

    fpI = fopen( argv[1],"rb" );
    if( fpI == NULL ) {
        fprintf( stderr,"ファイル'%s'がオープンできません\n",argv[1] );
        exit(1);
    }


    _splitpath( argv[1], drive, dir, fname, ext );
    for(n = 1; ! feof( fpI ); n++ ) {
        sprintf(path, "%s%s%s.%03d", drive, dir, fname, n);
        printf("%s\n", path);

        fpO = fopen( path,"wb" );
        if( fpO == NULL ) {
            fprintf(stderr,"出力ファイルのオープンに失敗しました。%s\n",path);
            break;
        }
        //  読んで書いて、読んで書いて、・・・
        for( rest=size; rest>0; rest-=BUFSIZE ) {
            len = fread( data,1, min(BUFSIZE,rest), fpI );
            fwrite( data,1,len,fpO );
        }
        fclose( fpO );
    }
    fclose( fpI );

    // バッチファイルも作る。親切。
    sprintf(path, "%s%s%s.bat", drive, dir, fname);
    printf("%s\n", path);
    fpO = fopen(path, "wt");
    fprintf(fpO, "copy /B %s%s%s.001", drive,dir,fname);
    for(i=2; i<n; i++) {
        fprintf(fpO, "+%s%s%s.%03d", drive,dir,fname,i);
    }
    fprintf(fpO, " %s", argv[1]);
    fclose(fpO);

    printf( "終了しました.\n" );
    return 0;
}