JetOpenFileInstance 函数

适用于: Windows |Windows Server

JetOpenFileInstance 函数

JetOpenFileInstance 函数会打开活动实例的附加数据库、数据库修补程序文件或事务日志文件,以便执行流式处理模糊备份。 随后可以使用 JetReadFileInstance 通过返回的句柄读取这些文件中的数据。 必须使用 JetCloseFileInstance 关闭返回的句柄。 实例的外部备份必须以前使用 JetBeginExternalBackupInstance 启动。

Windows XP:JetOpenFileInstance 是在 Windows XP 中引入的。

    JET_ERR JET_API JetOpenFileInstance(
      __in          JET_INSTANCE instance,
      __in          JET_PCSTR szFileName,
      __out         JET_HANDLE* phfFile,
      __out         unsigned long* pulFileSizeLow,
      __out         unsigned long* pulFileSizeHigh
    );

参数

instance

用于此调用的实例。

对于 Windows 2000,接受此参数的 API 变体不可用,因为仅支持一个实例。 在本例中,这一全局实例的使用是隐含的。

对于 Windows XP 及更高版本,仅当引擎处于旧模式 (Windows 2000 兼容模式时,才可调用不接受此参数的 API 变体) 其中仅支持一个实例。 否则,操作将失败并出现JET_errRunningInMultiInstanceMode。

szFileName

附加数据库、数据库修补程序文件或由为备份读取的实例管理的事务日志文件的相对或绝对路径。

phfFile

指向输出缓冲区的指针,该缓冲区接收要读取的文件的句柄。

pulFileSizeLow

指向输出缓冲区的指针,该缓冲区接收文件大小的最小有效 32 位。

pulFileSizeHigh

指向输出缓冲区的指针,该缓冲区接收文件大小的最大有效 32 位。

返回值

此函数返回具有以下返回代码之一 的JET_ERR 数据类型。 有关可能的 ESE 错误的详细信息,请参阅 可扩展存储引擎错误错误处理参数

返回代码

说明

JET_errSuccess

操作已成功完成。

JET_errBackupAbortByServer

操作失败,因为调用 JetStopBackupInstance 中止了当前外部备份。 此错误仅由 Windows XP 和更高版本返回。

JET_errClientRequestToStopJetService

无法完成操作,因为由于调用 JetStopServiceInstance,与会话关联的实例上的所有活动都已停止。

JET_errFileAccessDenied

操作失败,因为它无法打开请求的文件,因为共享冲突或权限不足。

JET_errFileNotFound

操作失败,因为它无法打开请求的文件,因为无法在指定路径中找到该文件。 此错误仅由 Windows 2000 返回。

JET_errInvalidBackupSequence

备份操作失败,因为它被按顺序调用。

JET_errInvalidPath

操作失败,因为找不到指定的路径。

JET_errInstanceUnavailable

无法完成该操作,因为与会话关联的实例遇到一个致命错误,该错误要求撤销对所有数据的访问以保护该数据的完整性。 此错误仅由 Windows XP 和更高版本返回。

JET_errInvalidParameter

提供的其中一个参数包含意外值或包含一个值,当与另一个参数的值组合时,该值没有意义。 在以下情况下 ,JetOpenFileInstance 可能会发生这种情况:

  • 指定的实例句柄 (Windows XP 及更高版本) 无效。

  • 指定的 filename 参数为 NULL 或零长度字符串, (Windows XP 及更高版本) 。

JET_errMissingFileToBackup

无法打开请求的文件进行备份,因为找不到该文件。 此错误仅由 Windows XP 和更高版本返回。

JET_errNoBackup

操作失败,因为没有外部备份正在进行。

JET_errNotInitialized

无法完成操作,因为尚未初始化与会话关联的实例。

JET_errOutOfMemory

操作失败,因为无法分配足够的内存来完成此操作。 如果在使用 JetOpenFileInstance 打开的上一个文件已被 JetCloseFileInstance 关闭之前尝试打开另一个文件,JetOpenFileInstance 将返回JET_errOutOfMemory。 目前仅支持一个未完成的文件句柄。

JET_errRestoreInProgress

无法完成操作,因为正在与会话关联的实例上执行还原操作。

JET_errRunningInMultiInstanceMode

操作失败,因为尝试在旧模式下使用引擎, (Windows 2000 兼容模式) 其中仅支持一个实例,但实际上已存在多个实例。

JET_errTermInProgress

无法完成操作,因为与会话关联的实例正在关闭。

成功后,返回所请求文件的句柄。 如果句柄针对数据库文件,则将为该数据库文件准备流式备份,这可能会导致在数据库文件所在的同一位置创建数据库修补程序文件。 数据库修补程序文件的路径和文件名与数据库文件完全相同,但具有 。PAT 扩展。 还将返回文件的大小。

失败时,输出缓冲区的状态将未定义。 可以在磁盘上临时创建数据库修补程序文件,并删除修补程序文件位置上的任何现有文件。 失败将导致取消实例的整个备份过程。 在 Windows XP 及更高版本中,如果尝试备份在调用时未附加到实例的数据库,则不会取消备份。

警告 出于安全原因,请务必注意 ,JetOpenFileInstance 不会验证请求的文件路径是否与为实例备份的一组文件相关联。 因此,可以使用此函数访问可由线程的当前安全上下文打开的任何文件。 应用程序必须将传递给此函数的路径限制为一组已知的良好文件路径,否则可能会发生信息泄露攻击。

备注

需要存在句柄和文件大小输出缓冲区。 如果它们不存在,则引擎将崩溃,因为未验证输出缓冲区参数。

目前,每次只能打开一个文件进行备份。

JetOpenFileInstance 在打开请求的文件之前不会断言备份特权。

此函数报告要读取的文件的大小可能与磁盘上的文件大小不匹配。 在 Windows XP 及更高版本中,数据库引擎可能会在还原操作期间将额外信息追加到数据库文件。 因此,应用程序应仅依赖于 JetOpenFileInstance 返回的文件大小或 JetReadFileInstance 返回的实际数据字节数。

要求

要求

客户端

需要 Windows Vista 或 Windows XP。

服务器

需要 Windows Server 2008 或 Windows Server 2003。

标头

在 Esent.h 中声明。

Library

使用 ESENT.lib。

DLL

需要ESENT.dll。

Unicode

实现为 JetOpenFileInstanceW (Unicode) 和 JetOpenFileInstanceA (ANSI) 。

另请参阅

JET_ERR
JET_HANDLE
JET_INSTANCE
JetAttachDatabase
JetBeginExternalBackupInstance
JetCloseFileInstance
JetGetAttachInfoInstance
JetGetLogInfoInstance
JetReadFileInstance
JetStopBackupInstance
JetTruncateLogInstance