Поделиться через


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

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

Синтаксис

HANDLE ReOpenFile(
  [in] HANDLE hOriginalFile,
  [in] DWORD  dwDesiredAccess,
  [in] DWORD  dwShareMode,
  [in] DWORD  dwFlagsAndAttributes
);

Параметры

[in] hOriginalFile

Дескриптор объекта для повторного открытия. Объект должен быть создан функцией CreateFile .

[in] dwDesiredAccess

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

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

[in] dwShareMode

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

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

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

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

Если объект уже открыт с доступом на удаление, в режиме общего доступа должен быть включен этот флаг.

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

Если объект уже открыт с доступом на чтение, этот флаг должен быть включен в режим общего доступа.

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

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

[in] dwFlagsAndAttributes

Флаги файла. Этот параметр может иметь одно или несколько из следующих значений.

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

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

FILE_FLAG_DELETE_ON_CLOSE
0x04000000
Указывает, что операционная система удаляет файл сразу после закрытия всех его дескрипторов, а не только указанного дескриптора, но и любых других открытых или повторяющихся дескрипторов.

Последующие запросы открытия файла завершаются ошибкой, если не используется FILE_SHARE_DELETE .

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

Приложение должно соответствовать определенным требованиям при работе с файлами, открытыми с помощью 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
При использовании этого флага обычная обработка точек повторного определения не выполняется, и ReOpenFile пытается открыть точку повторного обработки. При открытии файла возвращается дескриптор файла, независимо от того, работает ли фильтр, управляющий точкой повторного определения. Этот флаг нельзя использовать с флагом CREATE_ALWAYS . Если файл не является точкой повторного извлечения, этот флаг игнорируется.
FILE_FLAG_OVERLAPPED
0x40000000
Указывает системе инициализировать объект, чтобы операции, требующие значительного количества времени, обрабатывали возврат ERROR_IO_PENDING. После завершения операции для указанного события устанавливается состояние сигнала.

При указании FILE_FLAG_OVERLAPPED функции чтения и записи файлов должны указывать структуру OVERLAPPED . То есть при указании FILE_FLAG_OVERLAPPED приложение должно выполнять перекрывающиеся операции чтения и записи.

Если указан FILE_FLAG_OVERLAPPED , система не поддерживает указатель на файл. Положение файла должно передаваться как часть параметра lpOverlapped (указывающего на структуру OVERLAPPED ) в функции чтения и записи файла.

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

FILE_FLAG_POSIX_SEMANTICS
0x01000000
Указывает, что доступ к файлу должен осуществляться в соответствии с правилами POSIX. Это включает в себя разрешение нескольких файлов с именами, отличающимися только в случае, для файловой системы, поддерживающей такое именование. Будьте внимательны при использовании этого параметра, так как файлы, созданные с этим флагом, могут быть недоступны приложениям, написанным для MS-DOS или 16-разрядной версии Windows.
FILE_FLAG_RANDOM_ACCESS
0x10000000
Указывается, что доступ к файлу осуществляется произвольно. Система может использовать это в качестве указания для оптимизации кэширования файлов.
FILE_FLAG_SEQUENTIAL_SCAN
0x08000000
Указывает, что доступ к файлу осуществляется последовательно от начала к концу. Система может использовать это в качестве указания для оптимизации кэширования файлов. Если в приложении указатель позиции в файле перемещается для произвольного доступа, оптимального кэширования можно не достигнуть, однако правильная работа гарантируется.

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

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

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

Значение Значение
SECURITY_ANONYMOUS
Олицетворение клиента на уровне анонимного олицетворения.
SECURITY_CONTEXT_TRACKING
Режим отслеживания безопасности является динамическим. Если этот флаг не указан, режим отслеживания безопасности является статическим.
SECURITY_DELEGATION
Олицетворение клиента на уровне олицетворения делегирования.
SECURITY_EFFECTIVE_ONLY
Серверу доступны только включенные аспекты контекста безопасности клиента. Если этот флаг не указан, будут доступны все аспекты контекста безопасности клиента.

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

SECURITY_IDENTIFICATION
Олицетворение клиента на уровне олицетворения идентификации.
SECURITY_IMPERSONATION
Олицетворение клиента на уровне олицетворения олицетворения.

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

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

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

Комментарии

Параметр dwFlags не может содержать флаги атрибутов файла (FILE_ATTRIBUTE_*). Их можно указать только при создании файла.

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

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

Требования

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

См. также

CreateFile

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