Функция OpenFileById (winbase.h)

Открывает файл, соответствующий указанному идентификатору.

Синтаксис

HANDLE OpenFileById(
  [in]           HANDLE                hVolumeHint,
  [in]           LPFILE_ID_DESCRIPTOR  lpFileId,
  [in]           DWORD                 dwDesiredAccess,
  [in]           DWORD                 dwShareMode,
  [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  [in]           DWORD                 dwFlagsAndAttributes
);

Параметры

[in] hVolumeHint

Дескриптор любого файла в томе или общей папке, в которой хранится файл, который должен быть открыт.

[in] lpFileId

Указатель на FILE_ID_DESCRIPTOR , определяющий открываемую папку.

[in] dwDesiredAccess

Доступ к объекту . Доступ может быть для чтения, записи или и того, и другого.

Дополнительные сведения см. в разделе Безопасность файлов и права доступа. Нельзя запросить режим доступа, который конфликтует с режимом общего доступа, указанным в открытом запросе с открытым дескриптором.

Если этот параметр равен нулю (0), приложение может запрашивать атрибуты файла и устройства без доступа к устройству. Это полезно для приложения, чтобы определить размер дисковода гибких дисков и поддерживаемые им форматы без необходимости использовать гибкие диски на диске. Его также можно использовать для проверки существования файла или каталога, не открывая их для чтения или записи.

[in] dwShareMode

Режим совместного использования объекта, который может быть считывается, записывается, как, так и нет.

Нельзя запросить режим общего доступа, конфликтующий с режимом доступа, указанным в открытом запросе с открытым дескриптором, так как это приведет к следующему нарушению общего доступа: (ERROR_SHARING_VIOLATION). Дополнительные сведения см. в разделе Создание и открытие файлов.

Если этот параметр равен нулю (0) и OpenFileById выполняется успешно, объект не может быть общим и не может быть открыт снова, пока не будет закрыт дескриптор. Дополнительные сведения см. в разделе Примечания этого раздела.

Параметры общего доступа остаются в силе, пока вы не закроете дескриптор для объекта.

Чтобы позволить процессам совместно использовать объект, в то время как объект открыт другим процессом, используйте сочетание одного или нескольких из следующих значений, чтобы указать режим доступа, который они могут запрашивать для открытия объекта.

Значение Значение
FILE_SHARE_DELETE
0x00000004
Позволяет последующим операциям открытия объекта запрашивать доступ к удалению.

В противном случае другие процессы не смогут открыть объект, если они запрашивают удаление доступа.

Если этот флаг не указан, но объект был открыт для удаления доступа, функция завершается ошибкой.

FILE_SHARE_READ
0x00000001
Позволяет последующим операциям открытия объекта запрашивать доступ на чтение.

В противном случае другие процессы не смогут открыть объект, если они запрашивают доступ на чтение.

Если этот флаг не указан, но объект был открыт для чтения, функция завершается ошибкой.

FILE_SHARE_WRITE
0x00000002
Позволяет последующим операциям открытия объекта запрашивать доступ на запись.

В противном случае другие процессы не смогут открыть объект, если они запрашивают доступ на запись.

Если этот флаг не указан, но объект был открыт для доступа на запись или имеет сопоставление файлов с доступом на запись, функция завершается сбоем.

[in, optional] lpSecurityAttributes

Зарезервировано.

[in] dwFlagsAndAttributes

Флаги файла.

Когда OpenFileById открывает файл, он объединяет флаги файла с существующими атрибутами файла и игнорирует все предоставленные атрибуты файла. Этот параметр может включать любое сочетание следующих флагов.

Значение Значение
FILE_FLAG_BACKUP_SEMANTICS
0x02000000
Файл открывается для резервного копирования или восстановления. Система гарантирует, что вызывающий процесс переопределяет проверки безопасности файлов, если у процесса есть SE_BACKUP_NAME и SE_RESTORE_NAME привилегии. Дополнительные сведения см. в разделе Изменение привилегий в токене.

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

FILE_FLAG_NO_BUFFERING
0x20000000
Система открывает файл без системного кэширования. Этот флаг не влияет на кэширование жесткого диска. В сочетании с FILE_FLAG_OVERLAPPED флаг обеспечивает максимальную асинхронную производительность, так как операции ввода-вывода не зависят от синхронных операций диспетчера памяти. Однако некоторые операции ввода-вывода занимают больше времени, так как данные не хранятся в кэше. Кроме того, метаданные файла могут по-прежнему кэшироваться. Чтобы записать метаданные на диск, используйте функцию FlushFileBuffers .

Приложение должно соответствовать определенным требованиям при работе с файлами, которые открываются с помощью FILE_FLAG_NO_BUFFERING:

  • Доступ к файлу должен начинаться со смещений в байтах в файле, которые являются целыми числами, кратными размеру сектора тома.
  • Доступ к файлам должен быть для количества байтов, которые являются целыми числами, кратными размеру сектора тома. Например, если размер сектора составляет 512 байт, приложение может запрашивать чтение и запись 512, 1024, 1536 или 2048 байт, но не 335, 981 или 7171 байт.
  • Буферные адреса для операций чтения и записи должны быть выровнены по секторам, что означает выравнивание по адресам в памяти, которые являются целыми числами, кратными размеру сектора тома. В зависимости от диска это требование может не применяться.
Один из способов выравнивания буферов по целым числам, кратным размеру сектора тома, заключается в использовании VirtualAlloc для выделения буферов. Она выделяет память, выравниваемую по адресам, которые являются целыми числами, кратными размеру страницы памяти операционной системы. Так как размеры страницы памяти и сектора тома равны 2, эта память также выравнивается по адресам, которые являются целыми числами, кратными размеру сектора тома. Размер страниц памяти — 4–8 КБ; Секторы имеют размер 512 байтов (жесткие диски) или 2048 байт (CD), поэтому секторы томов никогда не могут быть больше страниц памяти.

Приложение может определить размер сектора тома, вызвав функцию GetDiskFreeSpace .

FILE_FLAG_OPEN_NO_RECALL
0x00100000
Данные файла запрашивается, но они должны по-прежнему находиться в удаленном хранилище. Его не следует переносить обратно в локальное хранилище. Этот флаг предназначен для использования системами удаленного хранения.
FILE_FLAG_OPEN_REPARSE_POINT
0x00200000
При использовании этого флага обычная обработка точки повторного определения не выполняется, и OpenFileById пытается открыть точку повторного определения. При открытии файла возвращается дескриптор файла, независимо от того, работает ли фильтр, управляющий точкой повторного определения. Этот флаг нельзя использовать с флагом CREATE_ALWAYS . Если файл не является точкой повторного извлечения, этот флаг игнорируется.
FILE_FLAG_OVERLAPPED
0x40000000
Файл открывается или создается для асинхронного ввода-вывода. После завершения операции событие, указанное для вызова в структуре OVERLAPPED , задается в состояние сигнала. Операции, которые занимают значительное количество времени для обработки возвращаемых ERROR_IO_PENDING.

Если этот флаг указан, файл можно использовать для одновременных операций чтения и записи. Система не поддерживает указатель на файл, поэтому необходимо передать положение файла в функции чтения и записи в структуре OVERLAPPED или обновить указатель файла.

Если этот флаг не указан, операции ввода-вывода сериализуются, даже если вызовы функций чтения и записи указывают структуру OVERLAPPED .

FILE_FLAG_RANDOM_ACCESS
0x10000000
Доступ к файлу осуществляется случайным образом. Система может использовать это в качестве указания для оптимизации кэширования файлов.
FILE_FLAG_SEQUENTIAL_SCAN
0x08000000
Доступ к файлу осуществляется последовательно от начала до конца. Система может использовать это в качестве указания для оптимизации кэширования файлов. Если приложение перемещает указатель файла для произвольного доступа, оптимальное кэширование может не происходить. Тем не менее, правильная операция по-прежнему гарантируется.

Указание этого флага может повысить производительность приложений, которые считывают большие файлы с помощью последовательного доступа. Повышение производительности может быть еще более заметным для приложений, которые считывают большие файлы в основном последовательно, но иногда пропускают небольшие диапазоны байтов.

FILE_FLAG_WRITE_THROUGH
0x80000000
Система записывает данные через любой промежуточный кэш и переходит непосредственно на диск.

Если FILE_FLAG_NO_BUFFERING также не указан, так что действует системное кэширование, данные записываются в системный кэш, но сбрасываются на диск без задержки.

Если также указано FILE_FLAG_NO_BUFFERING , чтобы системное кэширование не действовало, данные немедленно сбрасываются на диск без прохождения системного кэша. Операционная система также запрашивает запись кэша жесткого диска на постоянный носитель. Однако не все оборудование поддерживает эту возможность записи.

Возвращаемое значение

Если функция завершается успешно, возвращается открытый дескриптор на указанный файл.

Если функция завершается неудачно, возвращается значение INVALID_HANDLE_VALUE. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Используйте функцию CloseHandle для закрытия дескриптора объекта, возвращаемого OpenFileById .

При вызове OpenFileById для файла, ожидающего удаления в результате предыдущего вызова DeleteFile, функция завершается ошибкой. Операционная система задерживает удаление файла, пока не будут закрыты все дескрипторы файла. GetLastError возвращает ERROR_ACCESS_DENIED.

В Windows 8 и Windows Server 2012 эта функция поддерживается следующими технологиями.

Технология Поддерживается
Протокол SMB 3.0 Нет
SMB 3.0 Transparent Failover (TFO) Нет
SMB 3.0 с масштабируемыми общими папками (SO) Нет
Файловая система общего тома кластера (CSVFS) Да
Восстанавливаемая файловая система (ReFS) Да

Требования

   
Минимальная версия клиента Windows Vista [только классические приложения]
Минимальная версия сервера Windows Server 2008 [только классические приложения]
Целевая платформа Windows
Header winbase.h (включая Windows.h)
Библиотека Kernel32.lib; ФайлExtd.lib в Windows Server 2003 и Windows XP
DLL Kernel32.dll
Распространяемые компоненты Windows SDK в Windows Server 2003 и Windows XP.

См. также раздел

ACCESS_MASK

CloseHandle

CreateFile

DeleteFile

FILE_ID_DESCRIPTOR

Функции управления файлами

GetFileInformationByHandleEx

GetOverlappedResult

ПЕРЕКРЫВАЮЩИХСЯ

OpenFile

ReadFile

WriteFile