CopyFileExA 函数 (winbase.h)

将现有文件复制到新文件,并通过回调函数向应用程序通知此操作的进度。

若要以事务处理操作的形式执行此操作,请使用 CopyFileTransacted 函数。

语法

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

参数

[in] lpExistingFileName

现有文件的名称。

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

提示

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

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

[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_ALLOW_DECRYPTED_DESTINATION
0x00000008
即使无法加密目标副本,复制加密文件的尝试也会成功。
COPY_FILE_COPY_SYMLINK
0x00000800
如果源文件是符号链接,则目标文件也是指向源符号链接所指向的同一文件的符号链接。

Windows Server 2003 和 Windows XP: 不支持此值。

COPY_FILE_FAIL_IF_EXISTS
0x00000001
如果目标文件已存在,复制操作将立即失败。
COPY_FILE_NO_BUFFERING
0x00001000
复制操作使用未缓冲的 I/O 执行,绕过系统 I/O 缓存资源。 建议用于非常大的文件传输。

Windows Server 2003 和 Windows XP: 不支持此值。

COPY_FILE_OPEN_SOURCE_FOR_WRITE
0x00000004
复制该文件,并打开原始文件进行写入访问。
COPY_FILE_RESTARTABLE
0x00000002
复制进度在目标文件中跟踪,以防复制失败。 可以通过为 lpExistingFileName 和 lpNewFileName 指定与失败的调用中使用的值相同的值,在以后重新启动失败的副本。 这可能会显著减慢复制操作的速度,因为新文件可能会在复制操作期间多次刷新。
COPY_FILE_REQUEST_COMPRESSED_TRAFFIC
0x10000000

请求基础传输通道在复制操作期间压缩数据。 并非所有媒体都支持该请求,在这种情况下,该请求将被忽略。 压缩属性和参数 (计算复杂性、内存使用情况) 无法通过此 API 进行配置,并且可能会在不同的 OS 版本之间发生更改。

此标志在 Windows 10 版本 1903 和 Windows Server 2022 中引入。 Windows 10,驻留在 SMB 共享上的文件支持 标志,其中协商的 SMB 协议版本为 SMB v3.1.1 或更高版本。

返回值

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

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

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

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

注解

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

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

现有文件的安全资源属性 (ATTRIBUTE_SECURITY_INFORMATION) 复制到新文件。

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

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

使用 CopyFileEx 复制加密文件时,函数会尝试使用源文件加密中使用的密钥来加密目标文件。 如果无法执行此操作,此函数将尝试使用默认密钥加密目标文件。 如果这两种方法都无法完成, CopyFileEx 将失败并 显示ERROR_ENCRYPTION_FAILED 错误代码。 如果希望 CopyFileEx 完成复制操作,即使目标文件无法加密,请在对 CopyFileEx 的调用中包含COPY_FILE_ALLOW_DECRYPTED_DESTINATION作为 dwCopyFlags 参数的值。

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

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

Windows 7、Windows Server 2008 R2、Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP: 如果要编写一个跨 LAN 优化文件复制操作的应用程序,请考虑使用 Windows 套接字 (Winsock) 中的 TransmitFile 函数。 TransmitFile 支持高性能网络传输,并提供一个简单的接口,用于将文件内容发送到远程计算机。 若要使用 TransmitFile,必须编写从源计算机发送文件的 Winsock 客户端应用程序,以及使用其他 Winsock 函数在远程计算机上接收文件的 Winsock 服务器应用程序。

在 Windows 8 和 Windows Server 2012 中,此函数由以下技术支持。

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

注意

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

要求

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

另请参阅

CopyFile

CopyFileTransacted

CopyProgressRoutine

CreateFile

文件特性常量

文件管理函数

MoveFile

MoveFileWithProgress

符号链接

TransmitFile