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_STOPCopyFileTransacted 将返回零,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_HIDDENFILE_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 [仅限桌面应用]
目标平台 窗户
标头 winbase.h (包括 Windows.h)
Kernel32.lib
DLL Kernel32.dll

另请参阅

CopyProgressRoutine

CreateFileTransacted

文件属性常量

文件管理功能

MoveFileTransacted

符号链接

事务性 NTFS