Иллюстрированный самоучитель по задачам и примерам Assembler

Файловый ввод-вывод в Win32

В этом разделе будут приведены минимальные сведения, необходимые для выполнения простых операций с файлами. В отличие от MS DOS среда Win32 способна поддерживать несколько файловых систем. Главные требования к этим системам – иерархичность и соблюдение определенных правил присвоения имен каталогам и файлам.

Перечислим функции API Win32, имеющие отношение к работе с файловой системой. Полное их описание можно получить в MSDN.

Функция Назначение
AreFileApisANSI Определение набора символов файла – ANSI или OEM
CancelIo Отменить все ждущие обработки операции (I/O) ввода и вывода
CloseHandle Закрыть открытый дескриптор файла
CopyFile, CopyFileEx CopyProgressRoutine Копирование существующего файла в новый
CreateDirectory, CreateDirectoryEx Определенная приложением функция обратного вызова, используемая с функциями CopyFileEx и MoveFileWithProgress. Она вызывается, когда завершается часть операции копирования или пересылки
CreateFile Создать каталог
DefineDosDevice Создать файл или объект специального типа
DeleteFile Определить, переопределить или удалить имена устройства MS DOS
FindCiose Удалить файл
FindCloseChangeNotification Закрыть указанный поисковый дескриптор (см. функции FindFirstFile и FindNextFile)
FindFirstChangeNotification Закрыть объект-уведомление об изменении файла
FindFirstFile, FindFirstFileEx, FindNextFile Создать объект-уведомление об изменении файла
FindNextChangeNotification Поиск файлов
FlushFileBuffers Сброс объекта-уведомления в занятое состояние
GetBinaryType Очистка буфера для указанного файла и запись всех буферизированных данных в файл
GetCurrentDirectory Определить, является ли файл исполняемым, и если это так, то для какой подсистемы – Win32, MS DOS, OS/2, POSIX и т. д.
GetDiskFreeSpace, GetDiskFreeSpaceEx Получить текущий каталог
GetDriveType Информация относительно указанного диска, включая количество свободного пространства на нем
GetFileAttributes, GetFileAttributesEx Определить тип диска – съемный, фиксированный, CD-ROM, электронный или сетевой
GetFilelnformationByHandle Получить атрибуты файла или каталога
GetFileSize, GetFileSizeEx Найти информацию относительно указанного файла
GetFileType Получить размер указанного файла
GetFullPathName Получить тип указанного файла
GetLogicalDrives, GetLogicalDriveStrings Получить полный путь и имя для указанного файла
GetLongPathName Определить доступные в настоящее время дисководы
GetShortPathName Преобразовать указанный путь к его длинной форме
GetTempFileName Получить псевдоним файла
GetTempPath Создать имя для временного файла
LockFile, LockFileEx Получить путь каталога для временных файлов Блокировка файла

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

Основное внимание уделено не полноте описания параметров для вызова той или иной функции и результатов ее работы (эту информацию можно найти в справочниках по функциям API), а деталям практической реализации файловых операций в программах на языке ассемблера. Для изучения подробностей работы функций API Win32 необходимо использовать какой-либо отладчик для Windows, например TD32.EXE.

Обработка ошибок

Прежде чем рассматривать функции API Win32, относящиеся к файловому вводу-выводу, отметим, как можно выяснить причину их ошибочного завершения. Для этого Windows предоставляет функцию GetLastError.

DWORD GetLastError(void):

Для вызова функции GetLastError не нужно передавать никаких параметров. Эту функцию необходимо вызывать сразу после функции API Win32, успешность работы которой мы проверяем.

;………
push offset info
push hFile
call GetFilelnformationByHandle
call GetLastError;в регистре ЕАХ возвращается код ошибки

В регистре ЕАХ возвращается код ошибки. Расшифровать его можно с помощью файла Winerror.h, где вместе с кодами ошибок приведены короткие сообщения о причине их возникновения.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.