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

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

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

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