Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Практический пример. Копирование файлов

Для работы всех вышеперечисленных нужно подключить библиотеку stdio.h

Общие операции по работе с файлами:

int _fileno(FILE *stream);

Данная функция возвращает дескриптор файла. Параметр stream - указатель на открытый файл. Также находится в библиотеке stdio.h

 

int _locking(int handle, int mode, long nbytes);

Блокирует или разблокирует байты файла начиная с текущей позиции в файле. Параметр handle - дескриптор файла, mode - тип блокировки может принимать следующие значения: _LK_LOCK - блокирует байты, если заблокировать байты не получается попытка повторяется через 1 секунду.Если после 10 попыток байты не заблокируются функция генерирует ошибку и возвращает -1;_LK_NBLCK - блокирует байты, если заблокировать байты не получается функция генерирует ошибку и возвращает -1;_LK_NBRLCK - то же самое, что и _LK_NBLCK;_LK_RLCK - то же самое, что и _LK_LOCK; _LK_UNLCK - разблокировка байт, которые были до этого заблокированы.Параметр nbytes - количество байт для блокировки.Функция locking возвращает -1, если происходит ошибка и 0 в случае успеха. Для работы этой функции нужно подключить io.h и sys/locking.h

 

int _access(const char *path, int mode);

Данная функция определяет разрешения файла, каталога. Параметр path - путь к файлу или директории. Параметр mode - флаги для проверки может принимать такие значения:00 - проверка на существование, 02 - проверка на разрешение на запись, 04 - проверка на разрешение на чтение, 06 - проверка на чтение и запись. Директории можно проверять только на существование. Если разрешение есть, функция возвращает ноль, в случае отсутствия -1.Для работы этой функции нужно подключить io.h.

 

 

long _filelength(int handle);

Возвращает размер файла в байтах.Параметр handle - дескриптор файла. В случае ошибки функция возвращает -1. Для работы этой функции нужно подключить io.h.

Реализуем в данном примере функцию копирования одного файла в другой. Пользователь с клавиатуры вводит путь к файлу, который будет копироваться, а также путь и имя куда необходимо произвести копирование. Я думаю, постановка задачи понятна, а вот и сама реализация.

Исходный код можно найти в каталоге Copy.

#include "iostream.h"#include "windows.h"#include "io.h"#include "stdio.h" // Функция, выводящая на экран строкуvoid RussianMessage(char *str){ char message[100]; CharToOem(str,message); cout<<message;}// Функция копирования файлаbool CopyFile(char *source,char *destination){ const int size=65536; FILE *src,*dest; // Открытие Файла if(!(src=fopen(source,"rb"))){ return false; } // Получение дескриптора файла int handle=_fileno(src); // выделение памяти под буффер char *data=new char[size]; if(!data){ return false; } // Открытие файла, куда будет производиться копирование if(!(dest=fopen(destination,"wb"))){ delete []data; return false; } int realsize; while (!feof(src)){ // Чтение данных из файла realsize=fread(data,sizeof(char),sizeof(char)*size,src); // Запись данных в файл fwrite(data,sizeof(char),sizeof(char)*realsize,dest); } // Закрытие файлов fclose(src); fclose(dest); return true;}voidmain(){ // __MAX_PATH - Константа, определяющая максимальный размер пути. // Даная константа содержится в stdlib.h char source[_MAX_PATH]; char destination[_MAX_PATH]; char answer[20]; RussianMessage(" Введите путь и название копируемого файлу: "); // Получение пути к первому файлу cin.getline(source,_MAX_PATH); // Проверка Существует ли файл if(_access(source,00)==-1){ RussianMessage(" Указан неверный путь или название файла "); return; } RussianMessage(" Введите путь и название нового файла: "); // Получение пути к второму файлу cin.getline(destination,_MAX_PATH); // Проверка на существование файла if(_access(destination,00)==0){ RussianMessage(" Такой Файл уже существует перезаписать его(1 - Да /2 - Нет)? "); cin.getline(answer,20); if(!strcmp(answer,"2")){ RussianMessage(" Операция отменена "); return; } else if(strcmp(answer,"1")){ RussianMessage(" Неправильный ввод "); return; } if(_access(destination,02)==-1){ RussianMessage(" Нет доступа к записи. "); return; } } // Копирование файла if(!CopyFile(source,destination)){ RussianMessage(" Ошибка при работе с файлом "); }}

 

<== предыдущая лекция | следующая лекция ==>
Функции для работы с файлами библиотеки языка C | Сложное сопротивление. Кручение с изгибом
Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 547; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.