CopyFileTransactedA 函数 (winbase.h)

[Microsoft 强烈建议开发人员使用替代方法来实现应用程序的需求。 TxF 开发的许多方案都可以通过更简单、更易用的技术来实现。 此外,TxF 在 Microsoft Windows 的未来版本中可能不可用。 有关详细信息,以及 TxF 的替代方法,请参阅 使用事务性 NTFS 的替代方法。]

将现有文件作为事务处理操作复制到新文件,并通过回调函数通知应用程序其进度。

语法

BOOL CopyFileTransactedA(
  [in]           LPCSTR             lpExistingFileName,
  [in]           LPCSTR             lpNewFileName,
  [in, optional] LPPROGRESS_ROUTINE lpProgressRoutine,
  [in, optional] LPVOID             lpData,
  [in, optional] LPBOOL             pbCancel,
  [in]           DWORD              dwCopyFlags,
  [in]           HANDLE             hTransaction
);

参数

[in] lpExistingFileName

现有文件的名称。

默认情况下,名称限制为MAX_PATH个字符。 若要将此限制扩展到 32,767 个宽字符,请在路径前面添加“\?\”。 有关详细信息,请参阅命名文件、路径和命名空间

提示

从 Windows 10 版本 1607 开始,可以选择删除MAX_PATH限制,而无需在前面添加“\\?\”。 有关详细信息>,请参阅命名文件、路径和命名空间的“最大路径长度限制”部分。

如果 lpExistingFileName 不存在, 则 CopyFileTransacted 函数失败, GetLastError 函数返回 ERROR_FILE_NOT_FOUND

文件必须驻留在本地计算机上;否则,函数将失败,最后一个错误代码设置为 ERROR_TRANSACTIONS_UNSUPPORTED_REMOTE

[in] lpNewFileName

新文件的名称。

默认情况下,名称限制为MAX_PATH个字符。 若要将此限制扩展到 32,767 个宽字符,请在路径前面添加“\?\”。 有关详细信息,请参阅命名文件、路径和命名空间

提示

从 Windows 10 版本 1607 开始,可以选择删除MAX_PATH限制,而无需在前面添加“\\?\”。 有关详细信息,请参阅 命名文件、路径和命名空间 的“最大路径长度限制”部分。

[in, optional] lpProgressRoutine

每次复制文件的另一部分时调用 LPPROGRESS_ROUTINE 类型的回调函数的地址。 此参数可以为 NULL。 有关进度回调函数的详细信息,请参阅 CopyProgressRoutine 函数。

[in, optional] lpData

要传递给回调函数的参数。 此参数可以为 NULL。

[in, optional] pbCancel

如果在复制操作期间将此标志设置为 TRUE ,则会取消该操作。 否则,复制操作将继续完成。

[in] dwCopyFlags

指定如何复制文件的标志。 此参数可以是以下值的组合。

含义
COPY_FILE_COPY_SYMLINK
0x00000800
如果源文件是符号链接,则目标文件也是指向源符号链接所指向的同一文件的符号链接。
COPY_FILE_FAIL_IF_EXISTS
0x00000001
如果目标文件已存在,则复制操作会立即失败。
COPY_FILE_OPEN_SOURCE_FOR_WRITE
0x00000004
复制该文件,并打开原始文件进行写入访问。
COPY_FILE_RESTARTABLE
0x00000002
复制进度在目标文件中跟踪,以防复制失败。 可以通过为 lpExistingFileName 和 lpNewFileName 指定与失败的调用中使用的值相同的值,在以后重启失败的副本。 这可能会显著减慢复制操作的速度,因为新文件可能会在复制操作期间多次刷新。

[in] hTransaction

事务的句柄。 此句柄由 CreateTransaction 函数返回。

返回值

如果该函数成功,则返回值为非零值。

如果函数失败,则返回值为零。 若要获取扩展错误信息,请调用 GetLastError

如果 lpProgressRoutine 由于用户取消操作而返回 PROGRESS_CANCELCopyFileTransacted 将返回零, GetLastError 将返回 ERROR_REQUEST_ABORTED。 在这种情况下,将删除部分复制的目标文件。

如果 lpProgressRoutine 由于用户停止操作而返回 PROGRESS_STOP则 CopyFileTransacted 将返回零, GetLastError 将返回 ERROR_REQUEST_ABORTED。 在这种情况下,部分复制的目标文件保持不变。

如果尝试使用已回滚的事务的句柄调用此函数, CopyFileTransacted 将返回 ERROR_TRANSACTION_NOT_ACTIVEERROR_INVALID_TRANSACTION

备注

此函数保留扩展属性、OLE 结构化存储、NTFS 文件系统备用数据流、安全属性和文件属性。

Windows 7、Windows Server 2008 R2、Windows Server 2008 和 Windows Vista: (ATTRIBUTE_SECURITY_INFORMATION) 现有文件的安全资源属性在Windows 8和Windows Server 2012之前不会复制到新文件。

如果目标文件已存在并且设置了FILE_ATTRIBUTE_HIDDEN或FILE_ATTRIBUTE_READONLY属性,则此函数将失败并ERROR_ACCESS_DENIED

TxF 不支持加密文件。

如果指定 了COPY_FILE_COPY_SYMLINK ,则适用以下规则:

  • 如果源文件是符号链接,则会复制符号链接,而不是目标文件。
  • 如果源文件不是符号链接,则行为没有变化。
  • 如果目标文件是现有的符号链接,则会覆盖符号链接,而不是目标文件。
  • 如果还指定 了COPY_FILE_FAIL_IF_EXISTS ,并且目标文件是现有的符号链接,则操作在所有情况下都会失败。
如果未指定 COPY_FILE_COPY_SYMLINK ,则适用以下规则:
  • 如果还指定 了COPY_FILE_FAIL_IF_EXISTS ,并且目标文件是现有的符号链接,则仅当符号链接的目标存在时,该操作才会失败。
  • 如果未指定 COPY_FILE_FAIL_IF_EXISTS ,则行为没有变化。

TxF 不支持链接跟踪。

在Windows 8和Windows Server 2012中,以下技术支持此功能。

技术 支持
服务器消息块 (SMB) 3.0 协议
SMB 3.0 透明故障转移 (TFO)
具有横向扩展文件共享的 SMB 3.0 (SO)
群集共享卷文件系统 (CsvFS)
弹性文件系统 (ReFS)
 

请注意,SMB 3.0 不支持 TxF。

注意

winbase.h 标头将 CopyFileTransacted 定义为别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将非特定编码别名的使用与非非特定编码的代码混合使用可能会导致不匹配,从而导致编译或运行时错误。 有关详细信息,请参阅 函数原型的约定

要求

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

另请参阅

CopyProgressRoutine

CreateFileTransacted

文件特性常量

文件管理功能

MoveFileTransacted

符号链接

事务性 NTFS