Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метлабораторн.ОС.doc
Скачиваний:
28
Добавлен:
13.04.2015
Размер:
346.11 Кб
Скачать

Лабораторна робота № 3 Засоби дослідження та роботи з файловими системами

Мета роботи:

Вивчити особливості застосування функцій Win32 API та основні засоби роботи з файлами при організації синхронного вводу-виводу.

Обладнання:

ПК, ОС Windows, середовище для відлагодження програмного коду (MS Visual Studio, С++ Builder та ін.).

Методичні вказівки з організації самостійної роботи студентів:

При підготовці до лабораторної роботи рекомендується ознайомитися: з лекційним матеріалом, присвяченим структурі програми, засобам адресації, опису регістрів та поданню даних у пам'яті ЕОМ. Теоретичні положення, які для цього необхідні викладені у пунктах 1.- 4. Після вивчення матеріалу треба виконати завдання до роботи, відповісти на контрольні запитання та скласти звіт.

Зміст звіту:

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

Теоретичні положення:

1. Опис функцій синхронного вводу/виводу

Основні функції, що використовуються для написання прогарам зчитування та запису інформації на прилади:

Функції читання і запису:

BOOL ReadFile (HANDLE hFile,

LPVOID IpBuffer,

DWORD nNunberOfBytesToRead,

LPDWORD IpNumberOfBytesRead,

LPOVERLAPPED IpOverlapped);

BOOL WriteFile (HANDLE hFile,

LPVOID IpBuffer,

DWORD nNumberOfBytesToWrite,

LPDWORD IpNumberOfBytesWritten,

LPOVERLAPPED IpOverlapped);

Параметр hFile- описувач пристрою, до якого необхідно отримати доступ.

Параметр IpBuffer вказує на буфер, в якого зчитуються дані з пристрою (або з якого записуються дані на пистрій).

Параметри nNumberOfBytesToRead і nNnmberOfBytesToWrite повідомляють функціям ReadFile та WriteFile, скільки байтів потрібно зчитати з пристрою або записати на нього.

Параметри IpNumberOfBytesRead і IpNumberOfBytesWritten містять адресу змінної типу DWORD, до якої функції заносять число успішно переданих байтів (з пристрою або на пристрій).

Параметр IpOverlapped при синхронному вводі/виводі повинен бути NULL.

Обидві функції - ReadFile і WriteFile при успішному виконанні повертають TRUE.

2. Опис функцій блокування/розблокування частин файлу

Блокування частини файлу здійснюється викликом:

BOOL LociFile(HANDLE hFile, DWORD dwFileOffsetlow, DWORD dwFileOffsetHigri. DWORD cbLockLow DWORD cbLockHigh):

Перший параметр, hFile, ідентифікує описувач файла, частину якого потрібно блокувати. Наступні (dwFileOffsetLow і dwFileOffsetHigh) визначають 64-битний зсув початку частини, що блокується всередині файла, а останні два (dwLockLow і dwLockHigh) - число байтів, що блокуються.

При успішному виконанні LockFile повертає TRUE.

Розблокування частини файлу:

BOOL UnlockFile(HANDLE hFile. DWORD dwFileOffsetLow DWORD awFileOftsether, DHORD colinlockLow, DWORD cbUnlockHigh);

Параметри функції UnlockFile аналогічні параметрам LockFile; те ж саме стосується і значення, яке повертається. При розблокуванні частини потрібно використовувати ті ж параметри, що і при блокуванні.

3. Приклад програми читання інформації з вхідного файлу і додавання її до іншого файлу

#include <windows.h>

HANDLE hMainInstance;

CHAR szText[255]; // Масив, для зберігання всіх повідомлень

CHAR *lpszP = szText;

char input_file[] = "C:\\temp\\R_file.txt"; /*змінна, що містить ім'я вхідного файлу і шлях до нього */

char output_file [] = "C:\\temp\\W_file.txt"; /* змінна, що містить ім'я вихідного файлу і шлях */

HANDLE hfile_r, hfile_w, IpBuf;

BOOL bRes;

char dataflow[30] = {0};

static int add=15,

size_r_w=30;

DWORD cod_er;

int Read_Write ();

/* Віконна функція */

LRESULT CALLBACK WndProc (HWND hWnd,INT uMsg,WPARAM wParam,LPARAM lParam)

{

switch (uMsg)

{

static HWND hButton;

case WM_CREATE :

{ /* Створення дочірнього вікна – кнопки */

hButton = CreateWindow ("BUTTON","Считывание",

WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE,

0,0,100,20,hWnd,NULL,hMainInstance,NULL);

return 0;

}

case WM_COMMAND : { /* Якщо повідомлення адресоване дочірньому вікну */

if ((HWND)lParam == hButton) Read_Write();

return 0;

}

case WM_DESTROY : {

PostQuitMessage (0);

return 0;

}

default : return DefWindowProc (hWnd,uMsg,wParam,lParam);

}

}

/* Точка входу */

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpszCmdLine, INT nCmdShow)

{

WNDCLASS WndClass = {0};

MSG msg;

HWND hWnd;

hMainInstance = hInstance;

WndClass.style = 0;

WndClass.lpfnWndProc = WndProc;

WndClass.cbClsExtra = 0;

WndClass.cbWndExtra = 0;

WndClass.hCursor = LoadCursor (NULL,IDC_ARROW);

WndClass.hIcon = NULL;

WndClass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);

WndClass.lpszMenuName = NULL;

WndClass.lpszClassName = "MyClass";

WndClass.hInstance = hInstance;

if (!RegisterClass (&WndClass))

MessageBox (NULL,"Class","Error",MB_OK);

hWnd = CreateWindow ("MyClass","Чтен_Зап",WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,

CW_USEDEFAULT,CW_USEDEFAULT,

NULL,NULL,hInstance,NULL

);

if (!hWnd)

MessageBox (NULL,"Ошибка создания окна","Error",MB_OK);

ShowWindow (hWnd, SW_SHOW);

UpdateWindow (hWnd);

// Отримуємо описувач вхідного файла

hfile_r = CreateFile (input_file, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

if (!hfile_r)

{

cod_er=GetLastError(); /* Присвоєння змінній коду помилки виконання функції CreateFile */

if (cod_er == 3 | cod_er == 2)

MessageBox (NULL,"Неверно указаны путь или имя входного файла", "Error", MB_OK);

else

{

wsprintf (lpszP,"Ошибка при при открытии входного файла, номер ошибки: %d \n",cod_er);

MessageBox (NULL,lpszP,"Error",MB_OK);

}

return 0;

}

// Отримуємо описувач вихідного файла

hfile_w = CreateFile (output_file,GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

if (!hfile_w)

{

cod_er=GetLastError();

if (cod_er == 3 | cod_er == 2)

MessageBox (NULL, "Неверно указаны путь или имя выходного файла !", "Error",MB_OK);

else

{

wsprintf (lpszP,"Ошибка при открытии выходного файла, номер ошибки: %d \n",cod_er);

MessageBox (NULL,lpszP,"Error",MB_OK);

}

return 0;

}

while (GetMessage (&msg,NULL,0,0))

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

CloseHandle (hfile_r); /* Закриття вхідного файла */

CloseHandle(hfile_w); /* Закриття вихідного файла */

return 0;

}

/* Функція виконання зчитування і вставки до другого файлу */