Для студентов згиа специальности 080403 ”Программное обеспечение




НазваниеДля студентов згиа специальности 080403 ”Программное обеспечение
страница8/34
Дата публикации25.02.2013
Размер3.71 Mb.
ТипМетодическое пособие
uchebilka.ru > Информатика > Методическое пособие
1   ...   4   5   6   7   8   9   10   11   ...   34

^ Создание и открытие файлов

Для создания или открытия файла необходимо воспользоваться функцией CreateFile:

HANDLE CreateFile(

__in LPCTSTR lpFileName,

__in DWORD dwDesiredAccess,

__in DWORD dwShareMode,

__in LPSECURITY_ATTRIBUTES lpSecurityAttributes,

__in DWORD dwCreationDisposition,

__in DWORD dwFlagsAndAttributes,

__in HANDLE hTemplateFile

);

Рассмотрим параметры этой функции.

  • lpFileName - Указатель на строку содержащую имя создаваемого или открываемого файла или устройства.

  • dwDesiredAccess - тип доступа. Может принимать значения (можно использовать одно или сразу несколько):

    • 0 - запрос. Функция не даст реального доступа к файлу, а выполнится как тест возможности создания или открытия файла (устройства).

    • GENERIC_READ - получить доступ к чтению

    • GENERIC_WRITE - получить доступ к записи

  • dwShareMode - флаги, указывающие на то, как создаваемый (открываемый) объект должен разделять досту между процессами. Это значит, как будет делиться доступ к файлу с другими процессами, если они тоже попытаются открыть этот файл. Параметр может принимать значения (можно использовать одно или сразу несколько):

    • FILE_SHARE_DELETE - другим процессам разрешается доступ к файла (устройству) только если требуется доступ на удаление (поддерживается только в Windows NT).

    • FILE_SHARE_READ - другим процессам разрешается только читать файл

    • FILE_SHARE_WRITE - другим процессам разрешается только писать в файл

  • lpSecurityAttributes - указатель на структуру типа SECURITY_ATTRIBUTES.

  • dwCreationDistribution - описывает, что делать с файлом, если он уже существует или его ещё нет. Параметр может принимать только одно из следующих значений (комбинация не допускается):

    • CREATE_NEW - создать новый файл. Если он уже существует, то произойдёт ошибка

    • CREATE_ALWAYS - создать новый файл. Если файл существует, то он будет перезаписан (обнулён).

    • OPEN_EXISTING - открыть существующий файл (устройство). Если файла нет, то произойдёт ошибка.

    • OPEN_ALWAYS - открыть файл. Если файла нет, то он будет создан как при использовании CREATE_NEW.

    • TRUNCATE_EXISTING - открыть файл и обрезать его размер до нуля. Параметр dwDesiredAccess должен содержать GENERIC_WRITE. Если файла нет, то произойдёт ошибка.

  • dwFlagsAndAttributes - атрибуты и флаги для создаваемого файла. Параметр может принимать комбинацию из значений, вот некоторые из них:

      • FILE_ATTRIBUTE_ARCHIVE - архивный

      • FILE_ATTRIBUTE_COMPRESSED - сжатый

      • FILE_ATTRIBUTE_HIDDEN - скрытый

      • FILE_ATTRIBUTE_NORMAL - нормальный

      • FILE_ATTRIBUTE_READONLY - только для чтения

      • FILE_ATTRIBUTE_SYSTEM - системный

      • FILE_ATTRIBUTE_TEMPORARY - временный

    • FILE_FLAG_WRITE_THROUGH - возможность записи в файл через кэш.

    • FILE_FLAG_NO_BUFFERING - нельзя использовать буферы или кэш

    • FILE_FLAG_OVERLAPPED – используется асинхронный режим работы с файлом.

  • hTemplateFile - файл шаблона.

Если функция выполнилась без проблем, то она возвращает указатель на открытое (созданное) устройства или файл. Через этот указатель мы получаем доступ к файлу.

Если произошла ошибка, то функция вернёт INVALID_HANDLE_VALUE

^ Поиск файлов

Чтобы начать поиск необходима API функция FindFirstFile:

HANDLE FindFirstFile(LPCTSTR lpFileName,

LPWIN32_FIND_DATA lpFindFileData

);

Имя файла может содержать маску (*,?).

Если произошла ошибка, то функция вернет значение INVALID_HANDLE_VALUE, иначе – handle поиска.

Структура WIN32_FIND_DATA содержит следующие элементы:

dwFileAttributes – атрибуты файла (директории);

ftCreationTime – время создания;

ftLastAccessTime – время последнего открытия;

ftLastWriteTime – время последнего изменения;

nFileSizeLow – размер файла ;

cFileName – имя файла.

Для продолжения поиска необходима функция FindNextFile:

BOOL FindNextFile( HANDLE hFindFile, //handle поиска
LPWIN32_FIND_DATA lpFindFileData

);

Если нет ошибок, функция возвращает не нулевое значение.

Пример. Поиск в текущей директории.

#include
#include

int main()
{
WIN32_FIND_DATA winFileData;
HANDLE hFile;
char szPath[MAX_PATH];
if(GetCurrentDirectory(sizeof(szPath),szPath))
{
cout<lstrcat(szPath,"\\*.*");
hFile = FindFirstFile(szPath,&winFileData);
if (hFile!=INVALID_HANDLE_VALUE)
{
do
{
cout<}
while (FindNextFile(hFile,&winFileData)!=0);
FindClose(hFile);
}
}
return 0;
}

^ Позиционирование указателя файла

При открытии файла указатель файла обычно устанавливается на начало файла. Для того, чтобы манипулировать указателем файла существуют специальные функции. Одной из них является функция SetFilePointer:

DWORD SetFilePointer(

HANDLE hFile,

LONG lDistanceToMove,

PLONG lpDistanceToMoveHigh,

DWORD dwMoveMethod

);

Первый аргумент hFile – это описатель того файла, с которым мы сейчас работаем и в котором перемещаем указатель. Второй аргумент, lDistanceToMove, является числом символов, на которое необходимо передвинуть указатель файла. Третий аргумент, lpDistanceToMoveHigh, указывает на переменную, содержащую старшие 32 разряда величины перемещения (используется для больших файлов). Последний аргумент, dwMoveMethod, определяет точку отсчета для перемещения указателя файла. Возможные значения этого аргумента: FILE_BEGIN – от начала файла, FILE_CURRENT – от текущей позиции, FILE_END – от конца файла.

^ Установка конца файла

Обычно при закрытии файла система сама устанавливает конец файла. Но иногда возникает необходимость увеличить или уменьшить размер файла. Для этих целей существует функция SetEndOfFile:

BOOL SetEndOfFile(HANDLE hFile);

Пример. Необходимо установить длину файла 65535 байтов.

HFILE hFile = CreateFile(. . . );

SetFilePointer(hFile, 65535, NULL, FILE_BEGIN);

SetEndOfFile(hFile);

CloseHandle(hFile);

^ Чтение данных из файла

Для чтения данных из файла используется функция ReadFile:

BOOL ReadFile(

HANDLE hFile,

LPVOID lpBuffer,

DWORD nNumberOfBytesToRead,

LPDWORD lpNumberOfBytesRead,

LPOVERLAPPED lpOverlapped

);

Параметры: hFile – описатель файла с доступом GENERIC_READ; lpBuffer указывает на буфер памяти для получения входных данных; nNumberOfBytesToRead – количество байтов, которое нужно прочитать из файла; lpNumberOfBytesRead указывает на переменную типа DWORD, в которую будет записано фактическое число байтов, прочитанное функцией ReadFile; lpOverlapped указывает на структуру типа OVERLAPPED.

Последний параметр используется только для асинхронного режима работы с файлами. В синхронном режиме в этом параметре надо задавать NULL.

^ Запись данных в файл

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

BOOL WriteFile(

HANDLE hFile,

LPCVOID lpBuffer,

DWORD nNumberOfBytesToWrite,

LPDWORD lpNumberOfBytesWritten,

LPOVERLAPPED lpOverlapped

);

Параметры: hFile – описатель файла с доступом GENERIC_WRITE; lpBuffer указывает на буфер, данных из которого мы хотим записать в файл; nNumberOfBytesToRead – количество байтов, которое нужно записать в файл; lpNumberOfBytesRead указывает на переменную типа DWORD, в которую будет записано фактическое число байтов, записанное функцией WriteFile; lpOverlapped указывает на структуру типа OVERLAPPED.

Последний параметр используется только для асинхронного режима работы с файлами. В синхронном режиме в этом параметре надо задавать NULL.

^ Характеристики файла

Самыми основными характеристиками файла являются его атрибуты, которые присваиваются файлу при его создании. Чтобы узнать атрибуты файла необходимо вызвать функцию GetFileAttributes:

DWORD GetFileAttributes(LPCSTR lpFileName);

Единственным аргументом этой функции является имя файла, атрибуты которого мы хотим получить. Возвращает функция двойное слово, биты которого соответствуют атрибутам файла.

Иногда возникает необходимость изменить какие-либо атрибуты файла. Для этой цели надо использовать функцию SetFileAttributes:

BOOL SetFileAttributes(

LPCSTR lpFileName,

DWORD dwFileAttributes

);

Если мы хотим узнать размер файла, то мы можем обратиться к функции GetFileSize:

DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);

Начиная с Windows 95, с файлом связаны три метки времени. Первая метка – это время создания файла, вторая – время последнего обращения к файлу, и третья – это время последней записи в файл. Для того, чтобы получить значения этих меток, нам необходимо обратиться к функции GetFileTime:

BOOL GetFileTime(

LPFILETIME lpCreationTime,

LPFILETIME lpLastAccessTime,

LPFILETIME lpLastWriteTime

);

Структура FILETIME представляет собой следующее:

typedef struct _FILETIME{

DWORD dwLowDateTime;

DWORD dwHighDateTime;

}FILETIME,*LPFILETIME;

В первое поле этой структуры, dwLowDateTime, функция запишет младшие 32 разряда метки времени, а во второе, dwHighDateTime, - старшие 32 разряда.

Следует отметить, что в фирме Microsoft время создания файлов измеряют, начиная от нуля часов 1 января 1601 года, при этом выражают его в наносекундах.

Для преобразования времени «в формате Microsoft» в формат, принятый в FAT, используется функция FileTimeToDosDateTime:

BOOL FileTimeToDosDateTime(

CONST FILETIME *lpFileTime,

LPWORD lpFatDate,

LPWORD lpFatTime

);

Для получения времени в более читабельном виде используется функция FileTimeToSystemTime:

BOOL FileTimeToSystemTime(

CONST FILETIME *lpFileTime,

LPSYSTEMTIME lpSystemTime

);

Второй аргумент, lpSystemTime, - это указатель на структуру типа SYSTEMTIME:

typedef struct _SYSTEMTIME{

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

}SYSTEMTIME,*LPSYSTEMTIME;

Обратной по отношению к функции FileTimeToSystemTime является функция SystemTimeTiFileTime. Есть также функция GetFileInformationByHandle, которая собирает всю информацию о файле. Более подробные сведения об этих функция смотрите в документации.

^ Уведомления об изменениях в файловой системе

Операционная система Windows также позволяет организовать рассылку уведомлений об удалении, изменении или создании файлов или каталогов. Для реализации файловых уведомлений служат три функции:

  • FindFirstChangeNotification

  • FindNextChangeNotification

  • FindCloseChangeNotification

Функцию FindFirstChangeNotification используют, чтобы открыть ссылку для управления процессом уведомления:

HANDLE FindFirstChangeNotification(

LPCSTR lpPathName,

BOOL bWatchSubtree,

DWORD dwNotifyFilter

);

Параметр lpPathName является указателем на строку, содержащую путь к директории, об изменениях в которой надо уведомлять. Параметр bWatchSubtree определяет, нужно ли получать уведомления об изменениях в поддиректориях заданной директории. Параметр dwNotifyFilter задает фильтр, указывающий события, уведомления о которых желательно получать. В качестве фильтрующих значений могут использоваться шесть флагов:

  • FILE_NOTIFY_CHANGE_FILE_NAME. Изменено имя файла в каталоге.

  • FILE_NOTIFY_CHANGE_DIR_NAME.Изменено имя каталога.

  • FILE_NOTIFY_CHANGE_ATTRIBUTES.Изменен атрибут файла или каталога.

  • FILE_NOTIFY_CHANGE_SIZE. Изменен размер файла.

  • FILE_NOTIFY_CHANGE_LAST_WRITE. Изменена дата последней записи файла.

  • FILE_NOTIFY_CHANGE_SECURITY. Изменен дескриптор защиты файла.

В случае сбоя при выполнении функции FindFirstChangeNotification она возвращает INVALID_HANDLE_VALUE. В случае нормального завершения возвращаемое функцией значение является описателем объекта, который в дальнейшем может быть использован при вызове таких синхронизирующих функций как WaitForSingleObject и WaitForMultipleObjects.

Пример. Написать программу, выводящую первое изменение в каталоге C:\demo_dir. Отслеживать изменение имен файлов в каталоге и изменение их размеров. Отслеживать также изменения и в подкаталогах данного каталога.

#include

#include
int main()

{

HANDLE hChangeHandle;

// Находим первое изменение в каталоге

hChangeHandle = FindFirstChangeNotification(

"C:\\demo_dir", // имя каталога

TRUE, // отслеживать также подкаталоги

FILE_NOTIFY_CHANGE_FILE_NAME //отслеживать изменение имен файлов

| FILE_NOTIFY_CHANGE_SIZE //и изменение их размеров

);

if(hChangeHandle == INVALID_HANDLE_VALUE)

{

cerr<<"Find first change notification failed."<
<<"The last error code: "<
cout<<"Press any key to finish.";

cin.get();

return 0;

}

cout<<"Wait for changes in the directory."<
//ждем первого изменения в каталоге

if(WaitForSingleObject(hChangeHandle,INFINITE)==

WAIT_OBJECT_0)

cout<<"First notification: the directory was changed."<
else{

cerr<<"Wait for single object failed."<
<<"The last error code: "<
cout<<"Press any key to finish.";

cin.get();

return 0;

}

FindCloseChangeNotification(hChangeHandle);

return 0;

}

^ Файлы, отображаемые в память

Официальный способ реализации памяти общего доступа в Win32 – это отображение файлов в память [4]. Два процесса могут одновременно получить доступ к одному и тому же файлу, отображенному в память, что позволяет им обмениваться данными. Однако при этом существенно снижается производительность, так как любое обращение к памяти общего доступа будет сопровождаться операцией файлового ввода/вывода [4]. Но эту проблему можно решить. Если при создании объекта ядра «проецируемый файл» в качестве описателя файла указать значение (HANDLE)0xFFFFFFFF, операционная система не будет ассоциировать этот объект с каким-лтбо файлом. В этом случае объект отображения будет использоваться для обеспечения общего доступа разных процессов к одному участку оперативной памяти.

Для того чтобы отобразить файл в память, необходимо выполнить следующие действия:

  • Создать или открыть файл, который мы хотим спроецировать в память.

  • Создать объект ядра «проецируемый файл».

  • Спроецировать данные файла на адресное пространство процесса.

После того, как мы завершили работу с файлом, спроецированным в память, нам необходимо выполнить следующие действия:

  • Отменить проецирование в память, то есть закрыть объект «проецируемый файл».

  • Закрыть проецируемый файл.

Создание объекта «проецируемый файл» выполняется с помощью функции CreateFileMapping:

HANDLE CreateFileMapping(

HANDLE hFile,

LPSECURITY_ATTRIBUTES lpsa,

DWORD flProtect,

DWORD dwMaximumSizeHigh,

DWORD dwMaximumSizeLow,

LPCSTR lpName

);

Первый аргумент, hFile, - это описатель файла, который мы хотим спроецировать в память. Третий аргумент, flProtect, определяет, какой атрибут защиты будет присвоен странице физической памяти, на которую проецируется файл. Обычно используются атрибуты PAGE_READONLY, PAGE_READWRITE, PAGE_WRITECOPY. Четвертый и пятый аргументы, dwMaximumSizeHigh и dwMaximumSizeLow соответственно, определяют максимальный размер проецируемого файла в байтах. Если нам необходимо спроецировать файл в память целиком, то в этих параметрах надо передать нули.

И, наконец, последний аргумент, lpName. В нем указывается имя объекта «проецируемый файл». Это необходимо для того, чтобы к спроецированному файлу могли бы получить доступ и другие процессы.

Проецирование данных файла на адресное пространство процесса выполняется с помощью функции MapViewOfFile:

LPVOID MapViewOfFile(

HANDLE hFileMappingObject,

DWORD dwDesiredAccess,

DWORD dwFileOffsetHigh,

DWORD dwFileOffsetLow,

DWORD dwNumberOfBytesToMap

);

Первый аргумент, hFileMappingObject, представляет собой описатель объекта ядра «проецируемый файл», полученный на предыдущем этапе. Второй аргумент, , определяет режим доступа к проекции файла. Возможные значения: FILE_MAP_WRITE, FILE_MAP_READ, FILE_MAP_ALL_ACCESS. Два следующих параметра задают смещение, начиная с которого файл проецируется в память. Размер отображаемой части файла задается через параметр dwNumberOfBytesToMap. Если этот аргумент равен нулю, то система считает, что нам необходимо отобразить весь файл.

Функция MapViewOfFile в случае удачного завершения возвращает указатель на начало области отображения файла. Если же функция завершает свою работу с ошибкой, то она возвращает NULL. Получив указатель на область отображения, мы можем работать с файлом так, словно это вовсе не файл, а область памяти.

Отмена отображения файла на адресное пространство процесса выполняется с помощью функции UnmapViewOfFile:

BOOL UnmapViewOfFile(LPCVOID lpBaseAddress);

В качестве аргумента этой функции надо передать указатель на начало области отображения.

Закрытие объекта ядра «проецируемый файл» выполняется вызовом функции CloseHandle.

    1. ^ Каналы

      1. Общие понятия

Межпроцессное взаимодействие (interprocess communication, IPC) может осуществляться с помощью файлов, отображаемых в память, сокетов, удаленного вызова процедур, сообщений, COM-технологии (OLE, DDE) и каналов [3].

Каналы бывают анонимными и именованными (начиная с Windows NT/2000). К обоим из них можно обращаться с помощью обычных функций ReadFile и WriteFile.

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

Программа, которая создает канал, называется сервером канала. Другие процессы, которые называются клиентами, могут связываться с каналом на другом его конце.

Разновидности каналов:

  • входные, выходные и дуплексные (двунаправленные);

  • байтовые и каналы сообщений;

  • блокируемые и неблокируемые;

  • именованные и анонимные.

Входной канал позволяет клиенту передавать, а серверу принимать информацию; выходной – наоборот.

В режиме байтового канала чтение информации прекращается при поступлении последнего байта из канала или при заполнении его буфера чтения. В режиме сообщения чтение информации прекращается при достижении конца сообщения (внутри этого канала система размещает в начале каждого записываемого фрагмента заголовок, хранящий сведения о длине фрагмента).

Каналы бывают блокируемыми и неблокируемыми. Данный атрибут влияет на результаты операций чтения, записи и соединения.

Таблица 2.7 Различия между блокирумым и неблокируемым режимами

Операция

Блокируемый режим

^ Неблокируемый режим

ConnectNamedPipe

Если клиента нет, канал блокируется до тех пор, пока клиент не подключится к его другому концу

Если клиента нет, немедленно возвращается FALSE

ReadFile

Если канал пуст, он блокируется до поступления сообщения

Если канал пуст, немедленно возвращается сообщение об ошибке

WrieFile

Если канал почти заполнен, он блокируется до тех пор, пока на другом конце не будет выполнена операция чтения

Если канал почти заполнен, функция немедленно завершается
1   ...   4   5   6   7   8   9   10   11   ...   34

Похожие:

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к лабораторному практикуму для студентов згиа...
Методические указания к лабораторному практикуму для студентов згиа специальности 080403 «Программное обеспечение автоматизированных...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания для студентов специальности 080403
Згиа [8, 10] и других вузов [4]. Наиболее полно описаны курсовые, дипломные и квалификационные работы, однако большинство положений...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания к курсовой работе по дисциплине «Системное...
Методические указания к курсовой работе по дисциплине «Системное программирование и операционные системы» для студентов специальности...

Для студентов згиа специальности 080403 ”Программное обеспечение iconПравила использования программного обеспечения в рамках программы...
Используя программное обеспечение вы тем самым подтверждаете свое согласие придерживаться этих правил. Если вы не согласны, не используйте...

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания по выполнению лабораторных работ по курсу “
Информационные управляющие системы и технологии, 080403 – Программное обеспечение автоматизированных систем

Для студентов згиа специальности 080403 ”Программное обеспечение iconКлассификация программного обеспечения
В отличие от аппаратного обеспечения, программы, которые выполняются на нем, неосязаемы и классифицируются как программное обеспечение....

Для студентов згиа специальности 080403 ”Программное обеспечение iconКурсовая работа выполняется на основании 'Задания на курсовую работу'...
Целью курсовой работы является закрепление практических навыков самостоятельной постановки и решения задачи обработки данных с помощью...

Для студентов згиа специальности 080403 ”Программное обеспечение icon1. Классификация программного обеспечения
Назначением ЭВМ является выполнение программ. Программа содержит команды, определяющие порядок действии компьютера. Совокупность...

Для студентов згиа специальности 080403 ”Программное обеспечение iconОпорный конспект лекций по дисциплине Компьютерная графика для специальности...
Тема. Основные понятия компьютерной графики. Аппаратное и программное обеспечение

Для студентов згиа специальности 080403 ”Программное обеспечение iconМетодические указания и задание к выполнению курсового проекта по...
Методические указания и задание к выполнению курсового проекта по дисциплине «Алгоритмическое и программное обеспечение электротехнических...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<