Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора 97.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
778.75 Кб
Скачать

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. Это означает, что в ка­кой-то момент времени будут существовать две копии, что может вызвать про­блемы при почти заполненном диске или большом файле. Этот способ влияет на атрибуты файла иначе, чем "настоящее" перемещение.

  • В именах файлов или каталогов не допускаются подстановочные знаки. Следует указывать конкретное имя.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]