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_NAMESE_RESTORE_NAME 特权,则系统会确保调用进程替代文件安全检查。 有关详细信息,请参阅 更改令牌中的特权

还可以设置此标志以获取目录的句柄。 如果指示,目录句柄可以传递给某些函数,以取代文件句柄。

FILE_FLAG_DELETE_ON_CLOSE
0x04000000
指示操作系统在关闭文件的所有句柄后立即删除文件,不仅是指定的句柄,还有任何其他打开或重复的句柄。

除非使用 FILE_SHARE_DELETE ,否则文件的后续打开请求将失败。

FILE_FLAG_NO_BUFFERING
0x20000000
指示系统在没有中间缓冲或缓存的情况下打开文件。 与 FILE_FLAG_OVERLAPPED 结合使用时, 标志可提供最大的异步性能,因为 I/O 不依赖于内存管理器的同步操作。 但是,某些 I/O 操作需要更长的时间,因为数据不会保存在缓存中。

使用 FILE_FLAG_NO_BUFFERING 打开的文件时,应用程序必须满足特定要求:

  • 文件访问必须从文件中的字节偏移量开始,该偏移量是卷扇区大小的整数倍。
  • 对于卷扇区大小的整数倍数的字节数,文件访问必须为 。 例如,如果扇区大小为 512 字节,则应用程序可以请求读取和写入 512、1024、1536 或 2048 字节,但不能请求 335、981 或 7171 字节。
  • 读取和写入操作的缓冲区地址应扇区对齐, (内存中的地址上对齐,这些地址是卷扇区大小) 的整数倍。 可能不会强制实施此要求,具体取决于磁盘。
在卷扇区大小的整数倍数上对齐缓冲区的一种方法是使用 VirtualAlloc 分配缓冲区。 它分配与操作系统内存页大小的整数倍的地址对齐的内存。 由于内存页和卷扇区大小均为 2 的幂,因此此内存也与卷扇区大小的整数倍的地址对齐。 内存页大小为 4-8 KB;扇区 (硬盘) 为 512 字节, (CD) 为 2048 字节,因此,卷扇区永远不能大于内存页。

应用程序可以通过调用 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 协议
SMB 3.0 透明故障转移 (TFO)
具有横向扩展文件共享的 SMB 3.0 (SO)
群集共享卷文件系统 (CSV)
弹性文件系统 (ReFS)

要求

   
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 winbase.h (包括 Windows.h)
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

CreateFile

文件管理函数