
- •1.1 Основы программирования в операционной системе Windows
- •1.1.1 Вызов функций api
- •1.1.2 Структура программы
- •1.2 Вопросы системного программирования в Windows
- •1.2.1 Страничная и сегментная адресация.
- •1.2.2 Адресное пространство процесса.
- •2.1 Управление процессами
- •2.2 Процессы и потоки в Windows
- •2.3 Создание процессов
- •2.4 Определение исполняемого образа и командной строки
- •2.5 Идентификация процессов
- •3.1 Создание потока. Функция CreateThread
- •3.2. Завершение потока
- •3.3 Другие функции работы с потоками
- •3.4 Структура context
- •3.5 Приоритеты потоков
- •4.1 Объект critical_section
- •4.2 Мьютексы
- •4.3 Семафоры
- •5.1 События
- •7.1 Кучи
- •7.2 Управление памятью кучи
- •Другие функции для работы с кучей
- •Резюме по управлению кучей
- •Отображение адресного пространства процесса в объекты отображения
- •Что такое импорт
- •Явная загрузка dll
- •Явное подключение экспортируемого идентификатора
- •10.1 Управление файлами и каталогами Создание и открытие файлов
- •10.2 Управление каталогами
- •10.3 Другие методы получения атрибутов файлов и каталогов
- •11.1 Блокировка файлов
- •11.2 Реестр
- •12.1 Стандартные устройства и консольный ввод-вывод
- •12.2 Асинхронный ввод-вывод и порты завершения
- •Параметры
- •Цели системы безопасности
- •Параметры
- •Аварийное завершение
- •Использование именованных каналов
- •Параметры
- •Наблюдение за сообщениями в именованном канале
- •Параметры
10.1 Управление файлами и каталогами Создание и открытие файлов
Для создания и открытия файлов всех типов служит единственная функция API Win32 – CreateFile. В приложении можно указать, будет ли выполняться чтение из файла, запись в файл или и то и другое. Можно также указать, предусматривается ли совместное использование этого файла для чтения, записи либо для того и другого.
HANDLE CreateFile ( LPCTSTR lpszName, DWORD fdwAccess,
DWORD fdwShareMode, LPSECURITY_ATTRIBUTES lpsa,
DWORD fdwCreate, DWORD fdwAttrsAndFlags, HANDLE hTemplateFile)
Возвращаемое значение: дескриптор объекта открытого файла или INVALID_HANDLE_FAILURE в случае неудачи.
Параметры
lpszName – указатель на строку, содержащую имя файла, канала или другого именованного объекта, который требуется открыть или создать
fdwAccess определяет режим доступа для чтения или записи значениями GENERIC_READ и GENERIC_WRITE соответственно. Могут использоваться другие имена констант. Эти значения можно объединить с помощью поразрядного “или”.
fdwShareMode – это объединение поразрядным “или” сочетание приведенных ниже значений:
0 – совместный доступ к файлу не допускается.
FILE_SHARE_READ – другие процессы, включая тот, что сделал данный вызов, могут открывать этот файл для параллельного чтения.
FILE_SHARE_WRITE – разрешается параллельная запись в файл.
Используя блокировку или другие механизмы, программист должен не допустить параллельных модификаций одного и того же файла.
lpsa указывает на структуру SECURITY_ATTRIBUTES.
fdwCreate определяет, надо ли создать новый файл, заменить существующий файл и т.д. Отдельные значения можно объединить оператором поразрядного “или”.
CREATE_NEW – завершается неудачей, если указанный файл уже существует; иначе создается новый файл.
CREATE_ALWAYS – существующий файл заменяется новым.
OPEN_EXISTING – неудача, если файл не существует.
OPEN_ALWAYS – файл открывается и создается, если он не существует.
TRUNCATE_ EXISTING – устанавливается нулевая длина файла. В fdwAccess должен быть задан по крайней мере доступ GENERIC_WRITE.
fdwAttrsAndFlags определяет атрибуты и флаги. Существует 16 флагов и атрибутов. Атрибуты – это характеристики файла, а не открытого дескриптора HANDLE; они игнорируются, когда открывается существующий флаг. Ниже перечислены некоторые важные атрибуты и флаги.
FILE_ATTRIBUTE_NORMAL – может использоваться, только если не установлены никакие другие атрибуты (однако флаги могут быть установлены).
FILE_ATTRIBUTE_ READONLY – приложения не могут не писать в файл, ни удалять его.
FILE_FLAG_DELITE_ON_CLOSE – полезен для временных файлов. Файл удаляется, когда закрывается его последний открытый дескриптор.
FILE_FLAG_OVERLAPPED – важен для асинхронного ввода-вывода. В Windows он имеет значение NULL всегда, кроме устройств последовательного ввода-вывода.
Еще несколько дополнительных флагов определяют способ обработки файла и позволяют Win32 оптимизировать быстродействие и целостность файла.
FILE_FLAG_WRITE_THROUGH – промежуточные кэши немедленно записываются в файл на диске.
FILE_FLAG_NO_BUFFERING – в пространстве пользователя не выполняется буферизация и кэширование, и данные передаются непосредственно в буфера программы и из них.
FILE_FLAG_RANDOM_ACCESS – файл предназначен для произвольного доступа, и Windows будет пытаться оптимизировать кэширование файла.
FILE_FLAG_SEQUENTIAL_SCAN – файл предназначен для последовательного доступа, и Windows соответственно оптимизирует кэширование. Эти два режима доступа не обязательны.
hTemplateFile – дескриптор файла, открытого с GENERIC_READ, определяющий расширенные атрибуты для вновь создаваемого файла, причем значения fdwAttrsAndFlags игнорируются. Обычно этот параметр равен NULL. Параметр hTemplateFile игнорируется, когда открывается существующий файл. С помощью этого параметра можно сделать так, чтобы атрибуты нового файла были такими же, как у существующего.
Закрытие файлов.
Дескрипторы закрываются и системные ресурсы освобождаются почти для всех объектов одной универсальной функцией. При закрытии дескриптора также уменьшается на единицу счетчик ссылок объекта.
BOOL CloseHandle (HANDLE hObject)
Возвращаемое значение: TRUE, если функция выполняется успешно; иначе FALSE.
Чтение файлов.
BOOL ReadFile ( HANDLE hFile, LPVOID lpBuffer,
DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped)
Возвращаемое значение: TRUE, если чтение завершается успешно.
Параметры.
hfile – дескриптор файла с доступом GENERIC_READ
lpBuffer указывает на буфер памяти для получения входных данных.
nNumberOfBytesToRead – количество байтов, которые нужно прочитать из файла.
lpNumberOfBytesRead – указывает на фактическое число байтов, прочитанное функцией ReadFile.
lpOverlapped указывает на структуру OVERLAPPED.
Запись в файл.
BOOL WriteFile ( HANDLE hFile, CONST VOID *lpBuffer,
DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped)
Возвращаемое значение: TRUE, если функция завершается успешно, иначе FALSE.
Win32 содержит множество функций управления файлами.
Для удаления файла:
BOOL DeleteFile (LPCTSTR lpszFileName)
Копирование файла:
BOOL CopyFile ( LPCTSTR lpszExistingFile, LPCTSTR lpszNewFile,
BOOL fFaillfExists)
CopyFile копирует определенный по имени существующий файл и присваивает копии указанное новое имя. Если файл с новым именем уже существует, он будет заменен, только если fFailIfExists равно FALSE.
Еще две функции служат для переименования, или "перемещения", файла. Эти функции также могут работать с каталогами.
BOOL MoveFile ( LPCTSTR lpszExisting, LPCTSTR lpszNew) ;
BOOL MoveFileEx ( LPCTSTR lpszExisting, LPCTSTR lpSzNew,
DWORD fdwFlags)
MoveFile завершается неудачно, если новый файл уже существует; для существующих файлов следует применять MoveFileEx.
Параметры
lpszExisting определяет имя существующего файла или каталога.
lpszNew определяет имя нового файла или каталога, который в MoveFile не должен существовать. Новый файл может находиться в другой файловой системе или на другом диске, но новые каталоги должны быть на том же диске. Если этот параметр имеет значение NULL, существующий файл удаляется.
fdwFlags определяет следующие опции:
MOVEFILE_REPLACE_EXISTING — используется для замены существующего файла;
MOVEFILE_WRITETHROUGH — гарантирует, что функция не возвращает управление, пока скопированный файл не будет переписан из промежуточного буфера на диск;
MOVEFILE_COPY_ALLOWED — когда новый файл находитсяна другом томе, перемещение осуществляется путем выполнения CopyFile и DeleteFile;
MOVEFILE_DELAY_UNTIL_REBOOT — этот флаг, который не может применяться вместе с movefile_copy_allowed, разрешен только для администраторов и задерживает фактическое перемещение файла до перезапуска системы.
Перемещение (переименование) файлов связано с несколькими важными ограничениями.
Поскольку в Windows 9x не реализована функция MoveFileEx, ее необходимо заменять последовательностью CopyFile и DeleteFile. Это означает, что в какой-то момент времени будут существовать две копии, что может вызвать проблемы при почти заполненном диске или большом файле. Этот способ влияет на атрибуты файла иначе, чем "настоящее" перемещение.
В именах файлов или каталогов не допускаются подстановочные знаки. Следует указывать конкретное имя.