#include <io.h>
#include <conio.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <malloc.h>
#include <errno.h>

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

	 int source, taget, i;
	 char *buffer;
	 unsigned count;

	 if(argc == 3) {

// Открываем исходный копируемый файл

		 if((source = open(argv[1], O_BINARY | O_RDONLY)) == - 1) {

			  printf("\nОшибка при открытии исходного файла: %d",
			  errno);
			  exit(-1);

		 }

// Открываем выходной файл. При необходимости создаем
// новый. Если файл уже существует, выводим на экран
// запрос на перезапись содержимого существующего файла

		taget = open(argv[2], O_BINARY | O_WRONLY | O_CREAT | O_EXCL,
									 S_IREAD | S_IWRITE);
		if(errno == EEXIST) {

			printf("\nФайл существует. Перезаписать? (Y,N)\n");

// Ожидаем ответ оператора и анализируем его

			i = getch();
			if((i == 'y') || (i == 'Y'))
				taget = open(argv[2], O_BINARY | O_WRONLY | O_CREAT | O_TRUNC,
											 S_IREAD | S_IWRITE);

		}

// Если выходной файл открыть невозможно, выводим
// сообщение об ошибке и завершаем работу программы

		if(taget == -1){
			  printf("\nОшибка при открытии выходного файла: %d",
			  errno);
			  exit(-1);
		}

// Будем читать и писать за один раз 10000 байтов

		count = 10000;

// Заказываем буфер для передачи данных

		if((buffer = (char *)malloc(count)) == NULL) {
			  printf("\nНедостаточно оперативной памяти");
			  exit(-1);
		}


// Копируем исходный файл

		while(!heof(source)) {

// Читаем count байтов в буфер buffer

			if((count = read(source, buffer, count)) == -1) {
			  printf("\nОшибка при чтении: %d",
			  errno);
			  exit(-1);
			}

// Выполняем запись count байтов из буфера в выходной файл

			if((count = write(taget, buffer, count)) == - 1) {
			  printf("\nОшибка при записи: %d",
			  errno);
			  exit(-1);
			}
		}

// Закрываем входной и выходной файлы

		close(source);
		close(taget);

// Освобождаем память, заказанную под буфер

		free(buffer);
	 }

// Если при запуске программы не были указаны
// пути для входного или выходного файла,
// выводим сообщение об ошибке

	 else
		  printf("\n"
					"Задайте пути для исходного"
					" и результирующего файлов!\n");
}

