Файловый ввод-вывод в 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, где вместе с кодами ошибок приведены короткие сообщения о причине их возникновения.
