РефератыИнформатика, программированиеПрПрограма для сканування каталогу на наявність відповідних файлів

Програма для сканування каталогу на наявність відповідних файлів

Міністерство освіти і науки України


Житомирський державний технологічний університет


Лабораторна робота №2


з курсу «Системне програмування»


м. Житомир 2011 р.


Зміст


1. Розібрати роботу програми find.с


2. Проекспериментувати з функціями findfirst(), findnext(), змінюючи атрибути шуканих файлів


3.Вияснити призначення поля ff_reserved в структурі ffblk


4.Сформувати сьогоднішню дату та час в два байти, відповідно описаним правилам


5.Змінити програму так, щоб вона показувала лише


Контрольні запитання


Висновок


Список використаної літератури


1.
Розібрати роботу програми find.с

Підключаємо стандартні бібліотеки:


#include <stdio.h>


#include <stdlib.h>


#include <dir.h>


#include <dos.h>


#include <conio.h>


Оголошуємо прототипи функцій:


void print_info( struct ffblk *find );


char *time_conv( unsigned time, char *char_buf );


char *date_conv( unsigned date, char *char_buf );


Головна функція main() отримує у якості аргументів цілочисельний аргумент argc який містить кількість аргументів у командному рядку та покажчик на масив покажчиків на рядки, де кожен вказує на певний аргумент командного рядка.


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


Оголошуємо змінну find типу ffblk, що єструктурою визначеною у бібліотеці <dir.h> і включає наступні поля:


char ff_reserved[ 21 ]; /* зарезервовано для MS-DOS */;


char ff_attrib; /* атрибут з елементу директорія */


unsigned ff_ftime; /* поле часу з елементу директорія */


unsigned ff_fdate; /* поле дати з елементу директорія */


long ff_fsize; /* поле розміру файлу з елементу директорія */


char ff_name[ 13 ]; /*ASCIIZ- рядок з ім’ям і розширенням файлу */


struct ffblk find;


Викличемо функцію findfirst(), задавши їй у якості параметрів другий аргумент із командного рядка, посилання на структуру find та файловий атрибут.


Функція findfirst() повертає нуль у випадку успіху, тобто даний оператор if перевіряє чи виконалась функція із заданими параметрами.


if( !findfirst( argv[1], &find, FA_ARCH ) ) {


Якщо findfirst() виконалася правильно, то інформація буде занесена до структури find. Викличемо функцію print_info(), яка і надрукує структуру у відповідному форматі.


printf( "n"


"nFile Name Attr Date Time Size"


"n------------ ---- ---------- -------- --------" );


print_info( &find );


}


У разі помилки findfirst() поверне -1 і виконається оператор else, який надрукує відповідну інформацію про правильність заповнення командного рядка і завершить виконання програми.


else {


printf( "nUsage: FIND filename"


"n Wildcards ""!"" and ""*"" is OK.n" );


getch();


exit( -1 );


}


Функція findnext() продовжує пошук файлів, який розпочала функціяfindfirst(). Findnext() також повертає нуль у випадку успішного виконання. Тому за допомогою оператора while продовжуємо пошук до тих пір доки це можливо, тобто доки findnext () не поверне -1.


while( !findnext( &find ) )


print_info( &find );


Завершимо виконання програми.


getch();


exit( 0 );


}


Функція print_info() призначена для друку структури ffblk у відповідному зрозумілому для користувача форматі. Функція нічого не повертає. У якості парметрів приймає покажчик на структуру ffblk.


void print_info( struct ffblk *pfind ) {


Оголосимо два мив мольних масиви, які будуть зберігати відповідно час та дату у форматі рядка.


char timebuf[10], datebuf[12];


Викличемо date_conv() та time_conv() для конвертації полів дати і часу із цілочисельного формату до рядкового.


date_conv( pfind->ff_fdate, datebuf );


time_conv( pfind->ff_ftime, timebuf );


Надрукуємо поля структури ffblk.


printf( "n%-12s ", pfind->ff_name);


printf( "0x%02X %8s %8s %8ld ",


pfind->ff_attrib, datebuf, timebuf, pfind->ff_fsize );


}


Функція time_conv() конвертує час представлений у вигляді одного беззнакового цілого у рядок. Функція приймає у якості параметрів числоt, яке і є часом, та покажчик на рядок *buf, що і буде представленням дати у форматі рядка. Функція повертає покажчик на рядок.


char *time_conv( unsigned t, char *buf ) {


Перетворення відбувається наступним чином. Оголосимо цілочисельні змінні hour, minute, second.


int hour, minute, second;


ff_ftime є 16-бітовою структурою поділеною на бітові області, кожна з яких і відповідає годині, хвилині, та секунді. Числу годин відповідають з 11 по 15 біти, хвилин – з 5 по 10, і секунд поділених на 2 – з 0 по 4 відповідно. Таким чином, для того щоб виокремити кожен із елементів, зсунемо побітово число t (час) на відповідну кількість бітів і скористаємося оператором & (і).


hour = ( t >> 11 ) & 0x1F;


minute = ( t >> 5 ) & 0x3F;


second = ( t & 0x1F ) * 2;


За допомогою функції sprintf() пер направимо змінні

hour, minute, second у відповідному форматі до масиву на який вказуєbuf.


sprintf( buf, "%2.2d:%02.2d:%02.2d", hour, minute, second);


return( buf );


}


Функція date_conv(), подібно функції time_conv(), переводить формат подачі дати із цілого числа в рядок. Дню відповідають з 0 по 4 біти, місяцю – з 5 по 8, а року, починаючи з 1980, – з 9 по 15 біти.


char *date_conv( unsigned d, char *buf ) {


int day, month, year;


day = d & 0x1f;


month = ( d >> 5 ) & 0x0f;


year = ( d >> 9 ) + 1980;


sprintf( buf, "%2.2d.%02.2d.%04.2d", day, month, year);


return( buf );


}


2. Проекспериментувати з функціями findfirst(), findnext(), змінюючи атрибути шуканих файлів


Функція findfirst() у якості одного із параметрів приймає атрибут відкриття файлу. Функція findnext() використовує ті ж атрибути, що визначені у функції findfirst(). Таким чином ми можемо встановити такі атрибути доступу:


· FA_RDONLY (Read-only attribute) – тільки для читання;


· FA_HIDDEN (Hidden file) – скриті файли;


· FA_SYSTEM (System file) – ситемні файли;


· FA_LABEL (Volume label) – мітка тому;


· FA_DIREC (Directory) – директорії;


· FA_ARCH (Archive) - архівніфайли.


3. Вияснити призначення поля ff_reserved в структурі ffblk


В структурі ffblk є поле ff_reserved, яке призначене для використання системою MS-DOS. Поле має тип масив розмірністю 21 символ.


4. Сформувати сьогоднішню дату та час в два байти, відповідно описаним правилам


Нехай маємо дату - 31.12.2010


Під дату виділяється 2 байти


|15. . . . . . . . . . .9|8. . . . . .5|4. . . . . . . .0|


|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|


| Years -1980 | Month | Day |


day 31 = 11111


mon 12 = 1100


yaer 2010-1980 = 0011110


date = 0000 0000 0000 0000


1. date = year


000000000 0011110


2. date << 4


00000 0011110 0000


3. date | mon


00000 0011110 1100


4. date << 5


0011110 1100 00000


5. date | day


0011110 1100 11111 = 15775


Отже, 31.12.2010 = 15775.


Нехай маємо час - 16:59:35.


Під дату виділяється 2 байти


|15…….....11|10...............5|4…............0|


|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|


| Hours | Minutes | Seconds/2 |


H 16 = 10000


M 59 = 111011


S 35/2 = 10001


time = 00000 000000 00000


1.time = H


00000 000000 10000


2.time << 6


00000 10000 000000


3.time | M


00000 10000 111011


4.time << 5


10000 111011 00000


5.time | S


10000 111011 10001 = 34673


Отже, 16:59:35 = 34673.


програма сканування файл директорія


5. Змінити програму так, щоб вона показувала лише


· директорії;


if( !findfirst( argv[1], &find, FA_ DIREC ) )


· приховані файли;


if( !findfirst( argv[1], &find, FA_ HIDDEN ) )


· системні файли;


if( !findfirst( argv[1], &find, FA_ SYSTEM ) )


· директорії та системні файли.


if( !findfirst( argv[1], &find, FA_ SYSTEM || FA_ DIREC ) )


Контрольні запитання


1. Як функція findnext() "дізнається", які файли потрібно шукати?


Функція findnext() шукає файли, параметри яких задані у функції findfirst().


2. Чому час зміни файла записується з точністю до двох секунд?


У структурі ffblk виділене поле unsigned ff_ftime для представлення часу. У цьому полі числу секунд поділених на 2 (тому із точністю до двох секунд) виділно 5 бітів – з 0 по 4 відповідно, а це максимум число 31.


3. Звідки береться інформація структури ffblk?


Якщо функція findfirst() знаходить файл, то структура ffblk заповнюється інформацією про каталог і файл


4. Що таке елемент директорію?


Директорій – це спеціальний файл на диску, який складається з так званих елементів директорію. Розмір елементу в MS-DOS – 32 байта. Розмір кореневого директорія обмежений і залежить від формату диску. Наприклад, для диску 360К байт в кореневому директорії може розміститься тільки 112 елементів. Файл кореневого директорія розташується в фіксованому місці диску. Нижчі в ієрархії директорії називаються субдиректоріями вони можуть розташуватися в будь-якому місці диску і мати число елементів, обмежене лише фізичним об’ємом диску.



Формат елементу директорію MS-DOS


Висновок


Отже, на даній лабораторній роботі було проаналізовано програму для сканування каталогу на наявність відповідних файлів. У ході виконання було розібрано роботу функцій findfirst() та findnext(), а також будову та призначення структури ffblk.


У ході виконання лабораторній роботи, були здобуті навики роботи зі структурою ffblk, а саме з переведенням дати та часу у формат типу unsigned.


Список використаної літератури


1. Касаткін А.І. Управление ресурсами. - Минск: Вышейшая школа, 1992.


2. Касаткін А.І. Системное программирование. - Минск: Вышейшая школа, 1991.


3. Власенко О.В., Данильченко О.М., Северин О.О. Системне прогрмамування. Курс лекцій. Частина 1. (бібліотека ЖІТІ)

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Програма для сканування каталогу на наявність відповідних файлів

Слов:1392
Символов:11684
Размер:22.82 Кб.