MoveFileWithProgressA 函数 (winbase.h)

移动文件或目录,包括其子级。 可以提供用于接收进度通知的回调函数。

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

语法

BOOL MoveFileWithProgressA(
  [in]           LPCSTR             lpExistingFileName,
  [in, optional] LPCSTR             lpNewFileName,
  [in, optional] LPPROGRESS_ROUTINE lpProgressRoutine,
  [in, optional] LPVOID             lpData,
  [in]           DWORD              dwFlags
);

参数

[in] lpExistingFileName

本地计算机上现有文件或目录的名称。

如果 dwFlags 指定 MOVEFILE_DELAY_UNTIL_REBOOT,则文件不能存在于远程共享上,因为在网络可用之前执行了延迟的操作。

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

提示

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

[in, optional] lpNewFileName

本地计算机上文件或目录的新名称。

移动文件时, lpNewFileName 可以位于其他文件系统或卷上。 如果 lpNewFileName 位于另一个驱动器上,则必须在 dwFlags 中设置MOVEFILE_COPY_ALLOWED标志。

移动目录时, lpExistingFileNamelpNewFileName 必须位于同一驱动器上。

如果 dwFlags 指定 MOVEFILE_DELAY_UNTIL_REBOOTlpNewFileNameNULL则 MoveFileWithProgress 将注册在系统重启时要删除的 lpExistingFileName 。 如果函数无法访问注册表来存储有关删除操作的信息,该函数将失败。 如果 lpExistingFileName 引用目录,则仅当目录为空时,系统才会在重启时删除该目录。

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

提示

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

[in, optional] lpProgressRoutine

指向 CopyProgressRoutine 回调函数的指针,每次移动文件的另一部分时都会调用该回调函数。 如果提供显示操作进度的用户界面,回调函数可能很有用。 此参数可以为 NULL。

[in, optional] lpData

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

[in] dwFlags

移动选项。 此参数可使用以下一个或多个值。

含义
MOVEFILE_COPY_ALLOWED
2 (0x2)
如果要将文件移动到其他卷,该函数将使用 CopyFileDeleteFile 函数模拟移动。

如果文件已成功复制到其他卷,并且无法删除原始文件,则函数会成功使源文件保持不变。

此值不能与 MOVEFILE_DELAY_UNTIL_REBOOT 一起使用。

MOVEFILE_CREATE_HARDLINK
16 (0x10)
保留供将来使用。
MOVEFILE_DELAY_UNTIL_REBOOT
4 (0x4)
在重新启动操作系统之前,系统不会移动文件。 系统在执行 AUTOCHK 之后、创建任何分页文件之前立即移动文件。 因此,此参数使 函数能够从以前的启动中删除分页文件。

仅当进程位于属于管理员组或 LocalSystem 帐户的用户的上下文中时,才能使用此值。

此值不能与 MOVEFILE_COPY_ALLOWED一起使用。

MOVEFILE_FAIL_IF_NOT_TRACKABLE
32 (0x20)
如果源文件是链接源,则函数失败,但在移动后无法跟踪该文件。 如果目标是使用 FAT 文件系统格式化的卷,则可能会出现这种情况。
MOVEFILE_REPLACE_EXISTING
1 (0x1)
如果存在名为 lpNewFileName 的文件,则函数将其内容替换为 lpExistingFileName 文件的内容。

如果 lpNewFileNamelpExistingFileName 命名目录,则不能使用此值。

MOVEFILE_WRITE_THROUGH
8 (0x8)
在磁盘上实际移动文件之前, 函数不会返回 。

设置此值可确保作为复制和删除操作执行的移动在函数返回之前刷新到磁盘。 刷新发生在复制操作结束时。

如果设置了 MOVEFILE_DELAY_UNTIL_REBOOT ,则此值无效。

返回值

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

如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。

跨卷移动文件时,如果 lpProgressRoutine 由于用户取消操作而返回PROGRESS_CANCEL,MoveFileWithProgress 将返回零GetLastError 将返回ERROR_REQUEST_ABORTED。 现有文件保持不变。

跨卷移动文件时,如果 lpProgressRoutine 由于用户停止操作而返回PROGRESS_STOP,MoveFileWithProgress 将返回零GetLastError 将返回ERROR_REQUEST_ABORTED。 现有文件保持不变。

注解

MoveFileWithProgress 函数将其操作与链接跟踪服务协调,因此可以在移动链接源时对其进行跟踪。

若要删除或重命名文件,必须具有对文件的删除权限或父目录中的删除子权限。 如果设置了除删除和删除子级以外的所有访问权限的目录,并且新文件的 ACL 继承,则应该能够创建文件而不删除该文件。 但是,你可以随后创建一个文件,你将获得在创建文件时返回的句柄上请求的所有访问权限。 如果在创建文件时请求了删除权限,则可以使用该句柄删除或重命名文件,但不能使用该句柄重命名该文件。

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

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

CsvF 将对压缩文件执行重定向 IO。

注意

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

要求

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

另请参阅

CopyFileEx

CopyProgressRoutine

文件管理函数

MoveFileEx

MoveFileTransacted