函数参考


_WinAPI_MoveFileEx

移动文件或目录,通过回调函数通知应用程序的进展.

#Include <WinAPIEx.au3>
_WinAPI_MoveFileEx ( $sExistingFile, $sNewFile [, $iFlags [, $pProgressProc [, $pData] )

参数

$sExistingFile 本地计算机上现有的文件名称或目录.
 如果 $iFlags 指定 $MOVE_FILE_DELAY_UNTIL_REBOOT, 文件不能为远程共享.
 因为在网络可用之前,延迟了操作的执行.
$sNewFile 本地计算机文件或目录的新名称.
 移动文件时,$sNewFile 可以是不同的文件系统或卷.
 如果 $sNewFile 在另一个驱动器上,必须设置 $iFlags 参数为 $MOVE_FILE_COPY_ALLOWED 标志.
移动目录时, $sExistingFile and $sNewFile 必须在同一个驱动器.
 如果 $iFlags 指定为 $MOVE_FILE_DELAY_UNTIL_REBOOT 与 $sNewFile 为 0,
 当系统重新启动时, 本函数注册的 $sExistingFile 将被删除
 如果 $sExistingFile 指定为目录时, 系统重新启动后,该目录被删除.
$iFlags [可选参数] 移动操作的选项. 参数可以是一或多个下列值:
 $MOVE_FILE_COPY_ALLOWED --- 如果该文件被移动到不同的卷,该函数使用 CopyFile 与 DeleteFile 函数的模拟移动
 $MOVE_FILE_CREATE_HARDLINK --- 保留供将来使用
 $MOVE_FILE_DELAY_UNTIL_REBOOT --- 系统不移动文件,直到操作系统重新启动
 $MOVE_FILE_FAIL_IF_NOT_TRACKABLE --- 如果源文件是一个链接源,但不能被跟踪移动,函数失败
 $MOVE_FILE_REPLACE_EXISTING --- 如果 $sNewFile 存在,函数替换为 $sExistingFile 文件的内容
 $MOVE_FILE_WRITE_THROUGH --- 该函数不返回,直到该文件在磁盘上完成移动
$pProgressProc [可选参数] 回调函数,每次调用该文件已复制的另一部分地址.
 (为了解更多信息,请参见 MSDN)
$pData [可选参数] 传递给回调函数的参数.

返回值

成功: 返回 1.
失败: 返回 0,并设置@error标志为非 0 值.

注意/说明

如果 $iFlags 参数指定 $MOVE_FILE_DELAY_UNTIL_REBOOT,
并且本函数不能访问注册表时,函数失败.
重新启动后,函数存储的文件位置被重新命名为下面的注册表值:
 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

相关

详情参考

在MSDN中搜索


示例/演示


#Include <APIConstants.au3>
#Include <Misc.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

Global $hProgressProc = DllCallbackRegister('_ProgressProc', 'dword', 'uint64;uint64;uint64;uint64;dword;dword;ptr;ptr;long_ptr')

ProgressOn('_WinAPI_MoveFileEx', 'Moving...', '', -1, -1, 2)

_WinAPI_MoveFileEx('C:\Test.tmp', 'D:\Test.tmp', $MOVE_FILE_COPY_ALLOWED, DllCallBackGetPtr($hProgressProc))
If @error Then
    _WinAPI_ShowLastError()
EndIf

DllCallbackFree($hProgressProc)

ProgressOff()

Func _ProgressProc($iTotalFileSize, $iTotalBytesTransferred, $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $iData)

    Local $Percent = Round($iTotalBytesTransferred / $iTotalFileSize * 100)

    If $Percent = 100 Then
        ProgressSet($Percent, '', 'Complete')
    Else
        ProgressSet($Percent)
    EndIf
    If _IsPressed('1B') Then
        Return $PROGRESS_CANCEL
    Else
        Return $PROGRESS_CONTINUE
    EndIf
EndFunc   ;==>_ProgressProc