cwnicol programming

プログラミング関連の投稿をすこしだけ

Windows環境 ファイル分割

・あるWindows環境で、フリーソフトのインストールが禁止されている。
・ファイルを分割したい。
・開発環境は手元にある。


上記に当てはまる場合には、下記コードを自分の環境でコンパイルして、
ファイルを分割しては?


(コマンドプロンプトでは、結合はできるが分割はできないために
こんなことを・・)

<使用方法>

1.分割
~~~~~~~
DevideFile 分割元ファイル名 分割ファイルサイズ(バイト)

分割元ファイルサイズに対して、分割ファイルサイズがあまりに小さいと
分割先ファイル数が多くなってしまうので注意。

テストは行ったが、念のため、分割先ファイルを結合して、分割元ファイルと
fcすることを推奨。
※fc /b 分割元ファイル 分割先ファイルを結合したファイル


2.結合
~~~~~~~
コマンドプロンプトにて、
copy /b hogehoge.wmv_* hogehoge.wmv
----------------------分割コードここから--------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void PrintHowUse();

int main(int argc,char *argv[]){

	FILE *fp;
	char *buf;
	FILE *fpOut;
	char name[1024];
	int i;
	int size;
	int flag;


	if(argc != 3){
		PrintHowUse();
		return EXIT_FAILURE;
	}

	fp = fopen(argv[1], "rb");
	if(fp == NULL){
		printf("ファイルを開けませんでした。(%s)\n\n", argv[1]);
		PrintHowUse();
		return EXIT_FAILURE;
	}


	buf = malloc(atoi(argv[2]));
	if(buf == NULL){
		printf("メモリ領域の確保に失敗しました。\n\n");
		PrintHowUse();
		return EXIT_FAILURE;
	}

	i = 0;
	flag = 0;

	while(1){ 
		memset(buf, 0x00, atoi(argv[2]));
		memset(name, 0x00, 1024);

		size = fread(buf, 1, atoi(argv[2]), fp);
		if(feof(fp) != 0){ /* ファイルの終わりまで */
			flag = 1;
		}

		sprintf(name, "%s_%05d", argv[1], i);
		fpOut = fopen(name, "wb");
		if(fp == NULL){
			printf("ファイルを開けませんでした。\n\n");
			PrintHowUse();
			return EXIT_FAILURE;
		}

		fwrite(buf, 1, size, fpOut);
		fclose(fpOut);
		
		if(flag == 1){
			break;
		}

		i++;
	}

	free(buf);
	fclose(fp);

	printf("分割完了\n");
	return EXIT_SUCCESS;
}


void PrintHowUse(){

	printf("<使い方>\n\n"
		"DevideFile ファイル名 分割ファイルサイズ(バイト)\n");

}

----------------------分割コードここまで--------------------------------