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_STOPCopyFileEx 将返回零,并且 getLastError 将返回 ERROR_REQUEST_ABORTED。 在这种情况下,部分复制的目标文件保持不变。

言论

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

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

现有文件的安全资源属性(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_HIDDENFILE_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) 是的
群集共享卷文件系统 (CsvFS) 是的
可复原文件系统 (ReFS) 是的
 

注意

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

要求

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

另请参阅

CopyFile

CopyFileTransacted

CopyProgressRoutine

CreateFile

文件属性常量

文件管理功能

MoveFile

MoveFileWithProgress

符号链接

TransmitFile