でかいファイルを指定バイトに分割
送り先のメールサーバの制限で、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; }