Last Update: Dec.8,2006

C Source Library

「LSI C-86 Ver.3.30c 試食版」、「Borland C++ 5.5」でコンパイル出来ます。

■ ファイルを分割する(分割ファイルを復元するバッチも出力)

/*  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;
}