Операционные системы. Учебное пособие. Марапулец Ю.В. - 133 стр.

UptoLike

Составители: 

SEM_FAILCRITICALERRORS. В этом случае при отсутствии гибкого диска в дисководе
система не будет отображать на экране каких-либо сообщений об ошибках.
Обладая дескриптором файла, можно выполнить чтение или запись данных при
помощи функций ReadFile() и WriteFile() соответственно. Эти функции работают стан-
дартным образом: в качестве параметров они принимают дескриптор файла, указатель
на буфер, длину буфера и указатель на переменную, в которой будет сохранено количе-
ство прочитанных или записанных байт. Если используется перекрывающийся
ввод/вывод, в качестве одного из аргументов необходимо передать указатель на струк-
туру OVERLAPPED. Для обычных файлов указатель на эту структуру всегда равен
NULL.
BOOL ReadFile( HANDLE hFile; // дескриптор файла
LPVOID lpBuffer; // буфер для временного хранения
// прочитанных данных
DWORD dwBytesToRead; // количество байтов, которые должны
// быть прочитаны
LPDWORD lpdwBytesRead; // возвращает количество прочитанных байтов
LPOVERLAPPED lpOverlapped ); // поддержка асинхронного ввода/вывода
BOOL WriteFile( HANDLE hFile, // дескриптор файла
CONST VOID *lpBuffer, //указывает данные, которые должны быть
// записаны в файл
DWORD dwBytesToWrite, // количество записываемых байтов
LPDWORD lpdwBytesWritten, // возвращает количество записанных байтов
LPOVERLAPPED lpOverlapped ); // задает поддержку асинхронного
// ввода/вывода
Чтобы закрыть файл, используется функция CloseHandle(). Эту функцию можно
использовать не только для закрытия дескрипторов файлов. С ее помощью можно за-
крыть любой другой дескриптор.
BOOL CloseHandle( HANDLE hObject);
Для примера приведен исходный код простой программы, использующей файло-
вые операции для отображения на экране содержимого одного или нескольких файлов.
Вызов CreateFile() открывает файл для чтения. После этого вызов GetStdHandle() воз-
вращает дескриптор стандартного вывода. Затем при помощи функций ReadFile() и Wri-
teFile() блоками по 4 Кбайт происходит передача содержимого файла с жесткого диска в
стандартный поток вывода. Передача продолжается до тех пор, пока программа не обна-
ружит конец файла.
#include <windows.h>
void MB(char *s) // Для удобства использования MessageBox
{
MessageBox(NULL, s, NULL, MB_OK | MB_ICONSTOP);
}
void docat(char *fname) // основная подпрограмма
{
HANDLE f=CreateFile ( fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0,
NULL);
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
if (f==INVALID_HANDLE_VALUE)
135
SEM_FAILCRITICALERRORS. В этом случае при отсутствии гибкого диска в дисководе
система не будет отображать на экране каких-либо сообщений об ошибках.
      Обладая дескриптором файла, можно выполнить чтение или запись данных при
помощи функций ReadFile() и WriteFile() соответственно. Эти функции работают стан-
дартным образом: в качестве параметров они принимают дескриптор файла, указатель
на буфер, длину буфера и указатель на переменную, в которой будет сохранено количе-
ство прочитанных или записанных байт. Если используется перекрывающийся
ввод/вывод, в качестве одного из аргументов необходимо передать указатель на струк-
туру OVERLAPPED. Для обычных файлов указатель на эту структуру всегда равен
NULL.

BOOL ReadFile( HANDLE hFile;      // дескриптор файла
           LPVOID lpBuffer;       // буфер для временного хранения
                                   // прочитанных данных
            DWORD dwBytesToRead; // количество байтов, которые должны
                                  // быть прочитаны
            LPDWORD lpdwBytesRead;// возвращает количество прочитанных байтов
            LPOVERLAPPED lpOverlapped ); // поддержка асинхронного ввода/вывода

BOOL WriteFile( HANDLE hFile,      // дескриптор файла
           CONST VOID *lpBuffer,   //указывает данные, которые должны быть
                                   // записаны в файл
      DWORD dwBytesToWrite,        // количество записываемых байтов
      LPDWORD lpdwBytesWritten,    // возвращает количество записанных байтов
      LPOVERLAPPED lpOverlapped ); // задает поддержку асинхронного
                                   // ввода/вывода
     Чтобы закрыть файл, используется функция CloseHandle(). Эту функцию можно
использовать не только для закрытия дескрипторов файлов. С ее помощью можно за-
крыть любой другой дескриптор.

BOOL CloseHandle( HANDLE hObject);

      Для примера приведен исходный код простой программы, использующей файло-
вые операции для отображения на экране содержимого одного или нескольких файлов.
Вызов CreateFile() открывает файл для чтения. После этого вызов GetStdHandle() воз-
вращает дескриптор стандартного вывода. Затем при помощи функций ReadFile() и Wri-
teFile() блоками по 4 Кбайт происходит передача содержимого файла с жесткого диска в
стандартный поток вывода. Передача продолжается до тех пор, пока программа не обна-
ружит конец файла.

#include 
void MB(char *s) // Для удобства использования MessageBox
{
       MessageBox(NULL, s, NULL, MB_OK | MB_ICONSTOP);
}
void docat(char *fname) // основная подпрограмма
{
       HANDLE f=CreateFile ( fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0,
                                    NULL);
       HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);
       if (f==INVALID_HANDLE_VALUE)

                                        135