Міністерствоосвіти і науки України
Житомирський державний технологічнийуніверситет
Лабораторнаробота №2
з курсу«Системне програмування»
м. />Житомир2011 р.
Зміст
1. Розібрати роботупрограми find.с
2. Проекспериментуватиз функціями findfirst(), findnext(), змінюючи атрибути шуканих файлів
3.Вияснитипризначення поля ff_reserved в структурі ffblk
4.Сформуватисьогоднішню дату та час в два байти, відповідно описаним правилам
5.Змінитипрограму так, щоб вона показувала лише
Контрольні запитання
Висновок
Список використаної літератури
1.Розібрати роботу програми find.с
Підключаємо стандартні бібліотеки:
#include
#include
#include
#include
#include
Оголошуємо прототипи функцій:
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, що єструктуроювизначеною у бібліотеці і включає наступні поля:
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
00000 0011110 0000
3. date | mon
00000 0011110 1100
4. date
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
00000 10000 000000
3.time | M
00000 10000 111011
4.time
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. (бібліотека ЖІТІ)