Изучение функций (средств) Win32 API для работы с файлами и каталогами: Методические рекомендации по выполнению лабораторной работы, страница 3

Функция ReadFile  может закончиться успешно только, если файл, из которого предполагается читать, открыт с флагом GENERIC_READ.

·  Для записи данных в файл используется функция WriteFile.  Её синтаксис

BOOL WriteFile(HANDLE  hFile, LPVOID  lpBufferDWORD   nNumberOfBytesToWrite,     LPDWORD    lpNumberOfBytesWrittenLPOVERLAPPED   lpOverlapped)  по смыслу параметров  аналогичен функции  ReadFile.

Аргумент lpBuffer представляет собой указатель на буфер, данные из которого будут записывться в файл;  в буфер, на который указывает lpNumberOfBytesWritten записывается число байтов, которое в действительности будет записано в файл.

Для успешного использования функции WriteFile файл должен быть открыт с флагом GENERIC_WRITE.

В Приложении 2 приведена программа, в которой демонстрируются файловые функции Win32 API для записи и чтения данных.

3.     ЗАДАНИЕ   И    ПОРЯДОК  ВЫПОЛНЕНИЯ  РАБОТЫ

1.  Изучите синтаксис и параметры следующих функций Win32  API для работы с каталогами и файлами

·  GetCurrentDirectory( )  - получение текущей директории,

·  CreateDirectory( ) -  создание каталога,

·  RemoveDirectory( ) – удаление каталога,

·  CopyFile( ) – копирование файлов,

·  DeleteFile( ) – удаление файлов,

·  MoveFile( ) – перемещение файлов.

Справочные сведения по функциям можно получить в Help Windows 32 API, более подробные данные – в рекомендуемой литературе.

2.  Ознакомьтесь с демонстрационной программой, в которой используются эти функции. Программа приведена в Приложении 1.

3.  Изучите синтаксис и параметры функций для записи данных в файл и чтения из файла

· CreateFile( )  - открытие файла,

· CloseHandle( ) – закрытие файла,

· SetFilePointer( )  - позиционирование указателя файла,

· ReadFile( ) – чтение данных из файла,

· WriteFile( ) – запись данных в файл.

4.  Ознакомьтесь с примерами использования функций из п.3 в демонстрационных программах из Приложения 2 и Приложения 3.

5.  Составьте и выполните программу по индивидуальному заданию с использованием файловых функций Win32 API.

6.  Оформите отчет, проверьте свою подготовленность по контрольным вопросам и защитите лабораторную работу.

4.   КОНТРОЛЬНЫЕ   ВОПРОСЫ

1.  Какие файловые системы поддерживает ОС Windows NT / 2000?

2.  Как организуется одновременное сосуществование различных файловых систем в Windows NT / 2000?

3.  Объясните метод учета кластеров в файловой системе NTFS.

4.  Сформулируйте основные особенности файловой системы NTFS.

5.   Поясните физическую организацию файловой системы FAT32 и её особенности.

6.  Объясните различия между синхронным и асинхронным вводом / выводом.

7.  В  чем различия между функциями файловой системы Win32 API и соответствующими функциями языков С и С++?

8.  Перечислите основные функции Win32 API для работы с каталогами и объясните их синтаксис.

9.  Составьте и выполните программу получения текущей директории и создания нового каталога.

10.  Составьте и выполните программу с демонстрацией копирования, перемещения и удаления файлов средствами Win32 API.

11.  Объясните параметры функции CreateFile( ).

12.  Как в команде CreateFile обеспечиваются установки вида доступа к файлу и режимы совместного доступа?

13.  Каким образом в CreateFile( ) устанавливаются атрибуты файла?

14.  Составьте и выполните программу, в которой выполняется создание файла и запись в него данных

15.  Составьте и выполните программу, в которой предусмотрено открытие файла и чтение из него данных с помощью функций Win32 API.

16.  Какие функции С++ можно использовать для открытия файла и чтения из него данных?

     Когда следует применять функции С++ и когда функции Win32 API?

Рекомендуемая литература

1.  Сетевые операционные системы / В.Г.  Олифер, Н.А. Олифер. – СПб.: Питер, 2001

2.  Румянцев П.В. Работа с файлами в Win32  API. -  М.: Горячая линия  - Телеком, 2000.

3.  Вильямс А. Системное программирование в Windows 2000 для профессиналов. – СПб.: Питер, 2001.

Приложение1.

//Программа, демонстрирующая создание каталогов

//и копирование файлов в Windows 9x/NT с использованием API Win32

//Программа создает две директории, создает в каждой из них файлы,

// копирует файл из первой директории во вторую,

//в заключение удаляет файлы и созданные директории

// Тип приложения - Win32, GUI

#include <windows.h>

#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevinstance,

                     LPSTR lpszCmdParam, int nCmdShow)

{

  char cBuffer[0x400];

  char cBufferForCurrentDirectory[0x400];

  HANDLE hFile;

  // Сохраняем текущий каталог в буфере

  GetCurrentDirectory(0x400, cBufferForCurrentDirectory);

  strcpy(cBuffer, "c:\\мои документы\\Demo_Dir_1");

  // Создаем первый каталог

  if (CreateDirectory(cBuffer,NULL))

      MessageBox(NULL, "Директория c:\\мои документы\\Demo_Dir_1 создана",

                  "Информация", MB_OK);

  else

   {

    MessageBox(NULL, "Ошибка при создании директории \

               c:\\мои документы\\Demo_Dir_1 ", "Ошибка!", MB_OK);

    return 0;

   }

  // Установка первого каталога как текущего

  SetCurrentDirectory(cBuffer);

  // Создание файла в текущем каталоге

  if (INVALID_HANDLE_VALUE == (hFile=CreateFile("File_1.txt",                                                GENERIC_READ|GENERIC_WRITE,

                              FILE_SHARE_WRITE|FILE_SHARE_READ,

                              NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL)))

   {

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

    return 0;

   }

  else

  // закрываем файл для исключения ошибки доступа к файлу

  CloseHandle(hFile);

  strcpy(cBuffer,"c:\\мои документы\\Demo_Dir_2");

  // Создаем второй каталог

  if (CreateDirectory(cBuffer,NULL))

      MessageBox(NULL, "Директория c:\\мои документы\\Demo_Dir_2 создана",

                  "Информация", MB_OK);

  else

   {

    MessageBox(NULL, "Ошибка при создании директории \

               c:\\мои документы\\Demo_Dir_2 ", "Ошибка!", MB_OK);

    return 0;

   }

  // Установка текущим созданного второго каталога

  SetCurrentDirectory(cBuffer);

  // Создание файла "File_1.txt" в текущем каталоге

  if (INVALID_HANDLE_VALUE == (hFile=CreateFile("File_1.txt",                                                GENERIC_READ|GENERIC_WRITE,

                           FILE_SHARE_WRITE|FILE_SHARE_READ,

                           NULL,CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL)))