Delphi WinAPI CopyFile、CopyFileEx、CopyFileTransacted -复制文件
Delphi WinAPI CopyFile、CopyFileEx、CopyFileTransacted -复制文件
1、CopyFile
功能描述:将现有文件复制到新文件。CopyFileEx函数提供了两个附加功能。CopyFileEx可以在每次复制操作的一部分完成时调用指定的回调函数,并且可以在复制操作期间取消CopyFileEx。若要将此操作作为事务处理操作执行,请使用CopyFileTransacted函数。
函数原型:
1 2 3 4 5 | BOOL CopyFile( LPCTSTR lpExistingFileName, {源文件} //现有文件的名称。 LPCTSTR lpNewFileName, {目标文件} //新文件的名称 BOOL bFailIfExists {true 目标存在则跳过,false 直接覆盖} //如果此参数为TRUE,且lpNewFileName指定的新文件已存在,则函数将失败。如果此参数为FALSE且新文件已存在,则函数将覆盖现有文件并成功。 ); |
返回值:如果函数成功,则返回值为非零。如果函数失败,返回值为零。
Delphi 示例:
1 2 3 4 5 6 7 8 | var yFile,NewFile: string ; begin yFile := 'c:\text.txt' ; NewFile:= 'c:\temp\test.txt' ; if CopyFile( PChar (yFile), PChar (NewFile), True ) then ShowMessage( '复制成功' ) else ShowMessage( '复制失败' ); end ; |
2、CopyFileEx
功能描述:将现有文件复制到新文件,并通过 回调函数 通知应用程序其 进度。若要将此操作作为事务处理操作执行,请使用CopyFileTransacted函数。
函数原型:
1 2 3 4 5 6 7 8 | BOOL CopyFileEx( LPCSTR lpExistingFileName, LPCSTR lpNewFileName, LPPROGRESS_ROUTINE lpProgressRoutine, //LPPROGRESS_ROUTINE类型的回调函数的地址,每次复制文件的另一部分时调用该函数。此参数可以为NULL。 LPVOID lpData, //要传递给回调函数的参数。此参数可以为NULL。 LPBOOL pbCancel, //如果在复制操作期间将此标志设置为TRUE,则该操作将被取消。否则,复制操作将继续完成。 DWORD dwCopyFlags //指定如何复制文件的标志。 ); |
参数说明:
dwCopyFlags //指定如何复制文件的标志,可以以下的值:
-
- OPY_FILE_ALLOW_DECRYPTED_DESTINATION //即使目标副本无法加密,复制加密文件的尝试也会成功。
- COPY_FILE_COPY_SYMLINK //如果源文件是符号链接,则目标文件也是指向源符号链接指向的同一文件的符号链接。
- COPY_FILE_FAIL_IF_EXISTS //如果目标文件已存在,复制操作将立即失败。
- COPY_FILE_NO_BUFFERING //复制操作使用无缓冲I/O执行,绕过系统I/O缓存资源。建议用于非常大的文件传输。Windows Server 2003和Windows XP:不支持此值。
- COPY_FILE_OPEN_SOURCE_FOR_WRITE //将复制该文件,并打开原始文件进行写访问。
- COPY_FILE_RESTARTABLE //如果复制失败,将在目标文件中跟踪复制的进度。通过为lpExistingFileName和lpNewFileName指定与失败调用中使用的值相同的值,可以在以后重新启动失败的副本。这会显著降低复制操作的速度,因为在复制操作期间,新文件可能会被刷新多次。
- COPY_FILE_REQUEST_COMPRESSED_TRAFFIC //请求底层传输通道在复制操作期间压缩数据。可能并非所有介质都支持该请求,在这种情况下,该请求将被忽略。压缩属性和参数(计算复杂度、内存使用)无法通过该API进行配置,并且在不同的操作系统版本之间可能会发生变化。
返回值:
- 如果函数成功,则返回值为非零。
- 如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError。
- 如果lpProgressRoutine由于用户取消操作而返回PROGRESS_CANCEL,CopyFileEx将返回零,GetLastError将返回ERROR_REQUEST_ABORTED。在这种情况下,部分复制的目标文件将被删除。
- 如果lpProgressRoutine由于用户停止操作而返回PROGRESS_STOP,CopyFileEx将返回零,GetLastError将返回ERROR_REQUEST_ABORTED。在这种情况下,部分复制的目标文件保持不变。
2.1 关于LPPROGRESS_ROUTINE回调函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 | LPPROGRESS_ROUTINE LpprogressRoutine; DWORD LpprogressRoutine( [ in ] LARGE_INTEGER TotalFileSize, //文件的总大小(以字节为单位)。 [ in ] LARGE_INTEGER TotalBytesTransferred, //自复制操作开始以来,从源文件传输到目标文件的字节总数。 [ in ] LARGE_INTEGER StreamSize, //当前文件流的总大小(以字节为单位)。 [ in ] LARGE_INTEGER StreamBytesTransferred, //自复制操作开始以来,当前流中已从源文件传输到目标文件的字节总数。 [ in ] DWORD dwStreamNumber, //当前流的句柄。 首次调用 CopyProgressRoutine 时,流号为 1。 [ in ] DWORD dwCallbackReason, //调用 CopyProgressRoutine 的原因。 [ in ] HANDLE hSourceFile, //源文件的句柄。 [ in ] HANDLE hDestinationFile, //目标文件的句柄 [ in , optional] LPVOID lpData //由 CopyFileEx 传递给 CopyProgressRoutine 的参数。 ) |
返回值:
- PROGRESS_CANCEL //1 取消复制操作并删除目标文件。
- PROGRESS_CONTINUE //0 继续复制操作。
- PROGRESS_QUIET //3 继续复制操作,但停止调用 CopyProgressRoutine 以报告进度。
- PROGRESS_STOP //2 停止复制操作。 以后可以重启它。
2.1.1 关于调用CopyProgressRoutine的原因的参数取值:
- CALLBACK_CHUNK_FINISHED //0x00000000 复制了数据文件的另一部分。
- CALLBACK_STREAM_SWITCH //0x00000001 另一个流已创建,即将复制。 这是首次调用回调例程时给定的回调原因。
3、CopyFileTransacted
功能描述:将现有文件作为事务处理操作复制到新文件,并通过回调函数通知应用程序其进度。
函数原型:
1 2 3 4 5 6 7 8 9 | BOOL CopyFileTransacted( LPCSTR lpExistingFileName, LPCSTR lpNewFileName, LPPROGRESS_ROUTINE lpProgressRoutine, LPVOID lpData, LPBOOL pbCancel, DWORD dwCopyFlags, HANDLE hTransaction ); |
参数说明:以后有时间补充
创建时间:2020.08.31 更新时间:2022.03.29 、2024.03.27
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报