+7(960) 250-82-68 spam@mirossa.ru


 mirossa        1С           C         PHP       JAVA       MCU  


Статьи
 
 
Иногда использование архиватора для разрезки больших файлов для удобной их передачи не работает. Версии архиватора на обеих сторонах одинаковые, контрольные суммы файлов одинаковые, упаковка без сжатия(и др), но при распаковке возникает ошибка. В таких случаях использую эти программы.

Бывало, что нужно скопировать большой файл, а места на сервере не хватает под разрезанный файл. Тогда есть параметр 'extreme'. После записи каждого файла будет остановка до ввода любого символа. В паузу можно переместить (и удалить для освобождения места) очередной кусок файла.

Описание параметров - в комментариях к коду и на картинке.

Разрезать

CMD.exedownload cutter.exe
CMD.exedownload cutter_32bit.exe
//компиляция:
//cd "C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin"
//
//x86_64-w64-mingw32-gcc.exe cutter.c -o cutter.exe

//cd "C:\Program Files (x86)\C-Free 5\mingw\bin"
//gcc.exe cutter.c -o cutter_32bit.exe

// В командной строке указываем имя файла и количество байт(по сколько делить).
// В каталоге с программой создаются файлы 1, 2 и т.д.
// Деление проходит НЕ ТОЧНО по этому размеру, а в пределах буфера (сейчас указан 4096 байт)

// последним параметром можно указать 'extreme', тогда после записи каждого файла будет
// пауза до нажатия любой клавиши

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define BUFSIZE 4096

 int main(int argc, char * argv[]){
	
	FILE * fpr, * fpw;
	long int nb, sumbytes;
	unsigned char nameNewFile = 0;
	char nameNewFileText[10] = {0};
	size_t bytes;
	int extreme = 0, pause = 0;
	
	char temp[BUFSIZE];
	
	if ( argc < 3 ) {
		printf("Enter a file path and number of bytes.");
		return 0;
	}
	
	fpr = fopen(argv[1], "rb");
	if ( fpr == NULL){
			fprintf(stderr, "Error of reading.");
			exit(EXIT_FAILURE);
	}
	
	nb = atol(argv[2]);
	if ( nb == 0 ){
		printf("Enter a correct number of bytes.");
		fclose(fpr);
		return 0;
	}
	
	if ( argc >= 4 )
		if ( strcmp(argv[3], "extreme" ) == 0 )
			extreme = 1;
		
	
/////////////////////////////	
	
	if ( setvbuf(fpr, NULL, _IOFBF, BUFSIZE) != 0 ){
			fprintf(stderr, "Error of creating out buffer.");
			exit(EXIT_FAILURE);
	}
	
/////////////////////////////

nf:	nameNewFile++;

	if ( pause == 1 ){
		printf("%s file have done. To have written the next file press any key.", nameNewFileText);
		
		while ( getchar() != '\n' )
				;
		
		pause = 0; //не обязательно
	}
	
	if ( sprintf(nameNewFileText, "%d", nameNewFile) == 0){
		fprintf(stderr, "Error of making a file name.");
		exit(EXIT_FAILURE);
	}
		
	sumbytes = 0;
	while ( ( bytes = fread(temp, sizeof(char), BUFSIZE, fpr)) > 0 ){
		
		
		if (!sumbytes){
			 
					fpw = fopen(nameNewFileText, "wb");
					if ( fpw == NULL){
							fprintf(stderr, "Error of writing.");
							exit(EXIT_FAILURE);
					}
					if ( setvbuf(fpw, NULL, _IOFBF, BUFSIZE) != 0 ){
							fprintf(stderr, "Error of creating in buffer.");
							exit(EXIT_FAILURE);
					}
			 
		}
		
		fwrite(temp, sizeof(char), bytes, fpw);
		
		sumbytes += bytes;
		if ( sumbytes >= nb ){
			fclose(fpw); // проверить на ошибку
			
			if ( extreme )
				pause = 1;
			
			goto nf;  // :)
		}
		
	}
	
	if ( sumbytes > 0 )
		fclose(fpw);
	fclose(fpr);
	
	return 0;
}

Склеить

CMD.exedownload append.exe
CMD.exedownload append_32bit.exe
//компил¤ци¤:
//cd "C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\bin"
//
//x86_64-w64-mingw32-gcc.exe append.c -o append.exe

//cd "C:\Program Files (x86)\C-Free 5\mingw\bin"
//gcc.exe append.c -o append_32bit.exe

// в командной строке перечилить в правильном порядке все файлы, которые нужно склеить.
// результирующий файл будет с именем rez
//
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 4096

 int main(int argc, char * argv[]){
	
	FILE * fpr, * fpw;
	size_t bytes;
	char temp[BUFSIZE];
	int i;
		
	if ( argc < 3 ) {
		printf("Enter all file paths!");
		return 0;
	}
	
	fpw = fopen("rez", "wb");
	if ( fpw == NULL){
			fprintf(stderr, "Error of writing.");
			exit(EXIT_FAILURE);
	}
	if ( setvbuf(fpw, NULL, _IOFBF, BUFSIZE) != 0 ){
			fprintf(stderr, "Error of creating in buffer.");
			exit(EXIT_FAILURE);
	}
	
	
	for ( i = 1; i < argc; i++ ){
		
		fpr = fopen(argv[i], "rb");
		if ( fpr == NULL){
			fprintf(stderr, "Error of reading.");
			exit(EXIT_FAILURE);
		}
		if ( setvbuf(fpr, NULL, _IOFBF, BUFSIZE) != 0 ){
			fprintf(stderr, "Error of creating out buffer.");
			exit(EXIT_FAILURE);
		}
		
		while ( ( bytes = fread(temp, sizeof(char), BUFSIZE, fpr)) > 0 )
			fwrite(temp, sizeof(char), bytes, fpw);
		
		
		fclose(fpr);
	}
	
	
	fclose(fpw);
	
	
	return 0;
 }	

cut_glue

Комментарии




information