Міністерство освіти і науки України
Житомирський державний технологічний університет
Лабораторна робота №1
з курсу «Системне програмування»
на тему: «Програми копіювання файлів»
м. Житомир 2011 р.
Зміст
1. Навчитися користуватись програмами copy1.exe та copy2.exe.
2. Розібрати роботу програм
2.1 Робота програми «COPY1.EXE»
2.2 Робота програми «COPY1.EXE»
3. Експерименти з «copy1.c»
4. Експерименти з «copy2.c»
Контрольні запитання
Висновок
Список використаної літератури
1. Навчитися користуватись програмами copy1.exe та copy2.exe Програми «COPY1.С» та «COPY2.С» призначені для копіювання файлів. Програма «COPY1.С» використовує функції роботи з file handles, а «COPY2.С» - функції потокового вводу-виводу.
Для користування програмами:
· їх необхідно скомпілювати та отримати виконавчі файли «COPY1.EXE» та «COPY2.EXE»;
· запустити необхідну програму за допомогою командного рядка, ввівши відповідно "ім’я_прогрми" "файл_з_якого_копіювати" "файл_в_який_копіювати";
програма копіювання файл
2. Розібрати роботу програм
2.1 Робота програми «COPY1.EXE»
Підключаємо заголовочні файли для використання функцій та змінних:
#include <io.h> //open(), eof(), read(), write(), close()
#include <conio.h> //getch()
#include <stdio.h> //printf()
#include <stdlib.h> //exit()
#include <fcntl.h> //O_BINARY, O_RDONLY, O_WRONLY, O_CREAT, O_EXCL, O_TRUNC
#include <sys\types.h> //
#include <sys\stat.h> //S_IREAD, S_IWRITE
#include <alloc.h> //
#include <errno.h> //EEXIST
Макрос, що визначає розміру масиву
#define BUFSIZE 10000
Функція main() має два аргументи: цілочисельний аргумент argc який містить кількість аргументів у командному рядку та покажчик на масив покажчиків на рядки, де кожен вказує на певний аргумент командного рядка.
void main( int argc, char **argv ) {
Оголошуємо змінні:
int source, target;
int i;
char *buffer;
int count;
Перевіряємо чи правильна кількість аргументів у командному рядку. Якщо аргументів не три (програма, файл для копіювання, файл-копія), виводиться повідомлення про правильність заповнення командного рядка і виконання програми завершується.
if( argc != 3 ){
printf( "\n"
"Usage: COPY1 [d:][\\path]source_file [d:][\\path]target_file\n" );
getch();
exit( 1 );
}
Відкриваємо файл, який будемо копіювати за допомогою функції open(). Для цього передаємо в якості параметрів покажчик на імя файлу (argv[ 1 ]) та вказуємо типи доступу до файлу. O_BINARY - прапор доступу у бінарному режимі. O_RDONLY - прапор доступу до файлу "лише для читання". Функція open() у випадку успішного виконання повертає file handle і встановлює курсор на початок файлу, а у випадку помилки повертає -1 та встановлює errno в один із наступних станів: ENOENT, EMFILE, EACCES, EINVACC.
Даним if-ом перевіряємо успішність відкриття файлу, який варто копіювати.
if( ( source = open( argv[ 1 ], O_BINARY | O_RDONLY ) ) == -1 ) {
printf( "\nOpen source file error: %d", errno );
getch();
exit( 2 );
}
Відкриваємо файл, в який будемо копіювати за допомогою тієї ж функції open().
Прапор доступу до файлу встановлюємо в один із положень:
· O_BINARY - бінарний;
· O_WRONLY - для запису;
· O_CREAT - створюється;
· O_EXCL - перезаписується.
Прапор способу відкриття встановлюємо в один із положень:
· S_IREAD - може бути прочитаний;
· S_IWRITE - може бути записаний.
target = open( argv[ 2 ], O_BINARY | O_WRONLY | O_CREAT | O_EXCL,
S_IREAD | S_IWRITE );
Якщо при відкритті(створенні) файлу до якого буде відбуватися копіювання, errno дорівнює EEXIST (тобто файл з таким ім’ям вже існує), повідомити про існування файлу та запитати про необхідність його перезапису.
if( errno == EEXIST ) {
printf( "\nFile already exists. ............