■ ファイルを分割する(分割ファイルを復元するバッチも出力)
/* fsplit.c : ファイルを分割する
* (分割ファイルを復元するバッチも出力)
*
* Copyright (c) 2000-2002, 2006 AOK.
*
* 2000.10.21 - rev.1
* 2002.07.04 - rev.2
* 2006.12.08 - rev.3
*
* 使い方: FSPLIT ファイル名
*/
#include "misc.h"
typedef unsigned long ULONG;
/* 分割最大サイズ[1.25MB] */
#define MAX_SIZE 1024*1024*125/100
/* ターゲットファイル名 */
char filename[FILENAME_MAX];
FILE *fpb, *fpi, *fpo = NULL;
/* 分割処理本体 */
int fsplit(ULONG bytes)
{
char buf0[FILENAME_MAX];
char buf1[FILENAME_MAX];
char buf2[FILENAME_MAX];
char ext[4];
int ch, i = 0;
ULONG umax = 0;
extract_filename(buf0, filename);
for ( ; ; ) {
start:
sprintf(ext, "%03d", i);
change_ext(buf1, filename, ext);
extract_filename(buf2, buf1);
if ((fpo = fopen(buf1, "wb")) != NULL) {
while ((ch = fgetc(fpi)) != EOF) {
fputc((char)ch, fpo);
if (++umax >= bytes) {
umax = 0;
fclose(fpo);
printf("%s をコピーしました.\n", buf1);
if (i == 0)
fprintf(fpb, "copy /B %s %s\n", buf2, buf0);
else
fprintf(fpb, "copy /B %s + %s\n", buf0, buf2);
i++;
goto start; /* この goto の使い方は許されるだろう */
}
}
if (i == 0)
fprintf(fpb, "copy /B %s %s\n", buf2, buf0);
else
fprintf(fpb, "copy /B %s + %s\n", buf0, buf2);
fclose(fpo);
printf("%s をコピーしました.\n", buf1);
return 1;
} else {
/* error routine */
fprintf(stderr, "* %s をオープン出来ません.\n", buf1);
return 0;
}
}
}
/* メイン */
int main(int argc, char **argv)
{
char buf1[FILENAME_MAX];
char buf2[FILENAME_MAX];
puts("***************************************************************");
puts("* FSPLIT.EXE *");
puts("* Copyright (c) 2000-2002, 2006 AOK. All Rights Reserved. *");
puts("***************************************************************\n");
if (argc > 1) {
strcpy(filename, *++argv);
strlwr(filename);
if ((fpi = fopen(filename, "rb")) != NULL) {
change_ext(buf1, filename, "bat");
if ((fpb = fopen(buf1, "w")) != NULL) {
fsplit(MAX_SIZE);
extract_filename(buf2, filename);
fclose(fpb);
printf("%s をコピーしました.\n", buf1);
}
fclose(fpi);
}
} else {
fputs("パラメータが足りません.\n\n", stderr);
fputs("使い方: FSPLIT ファイル名\n", stderr);
return 1;
}
return 0;
}