# FileMove

移动或重命名一个或多个文件.

    FileMove SourcePattern, DestPattern , Overwrite

## 参数

SourcePattern

  类型: 字符串

  单个文件的名称或通配符模式, 例如 `"C:\Temp\*.tmp"`. 如果没有指定绝对路径, 则假定 SourcePattern 在 A_WorkingDir 中.

DestPattern

  类型: 字符串

  目标的名称或模式, 如果没有指定绝对路径, 则假定在 A_WorkingDir 中.

  如果星号存在, 则将文件名中的第一个星号(`*`) 替换为不包含其扩展名的源文件名, 而将最后一个句号(`.`) 后的第一个星号替换为源文件的扩展名. 如果有星号, 但省略了扩展名, 则使用源文件的扩展名.

  要执行简单地移动 -- 保留现有文件名 -- 只需指定文件夹名, 如下面功能几乎等同的两个例子所示:

      FileMove "C:\*.txt", "C:\My Folder"

      FileMove "C:\*.txt", "C:\My Folder\*.*"

  目标目录必须已经存在. 如果 My Folder 不存在, 上面第一个示例将使用 "My Folder" 作为目标文件名, 而第二个示例不会移动任何文件.

Overwrite

  类型: 整数(布尔值)

  此参数指定是否覆盖现有文件. 如果省略，则默认为 0(不覆盖). 否则, 指定以下数字之一:

  0: 不覆盖现有的文件. 如果 DestPattern 作为文件或目录已经存在, 则操作会失败且没有任何效果.

  1: 覆盖现在的文件. 但是, 不会删除在 DestPattern 中没有被 SourcePattern 目录中文件覆盖的其他子目录或文件.

## 错误处理

如果有文件移动失败, 则抛出 Error, 并且它的 Extra 属性设置为失败次数. 如果没有找到文件, 只有当 SourcePattern 缺少通配符 `*` 和 `?` 时, 才会抛出异常. 换句话说, 移动一个通配符模式, 如 `"*.txt"`, 当它不与任何文件匹配时, 被视为成功.

与 FileCopy 不同, 移动一个文件来覆盖它自己总被认为是成功的, 即使在覆盖模式没有生效的情况下.

如果找到了文件, 则 A_LastError 会被设置为 0(零) 或最近一次操作失败时调用操作系统 GetLastError() 函数的结果. 否则 A_LastError 包含了没有找到文件原因的错误码.

## 备注

FileMove 只移动文件. 要移动整个文件夹的内容(它的所有文件和子文件夹), 请参阅下面的示例部分. 要移动或重命名单个文件夹, 请使用 DirMove.

在遇到错误后操作仍会继续进行.

尽管此函数可以移动文件到不同的卷, 但这样的操作会比在相同卷上消耗更多的时间. 这是由于在相同卷上类似于重命名, 因此快速得多.

## 相关

FileCopy, DirCopy, DirMove, FileDelete

## 示例

移动文件而不进行重命名.

    FileMove "C:\My Documents\List1.txt", "D:\Main Backup\"

重命名单个文件.

    FileMove "C:\File Before.txt", "C:\File After.txt"

移动文本文件到新位置并使用新的扩展名重命名文件.

    FileMove "C:\Folder1\*.txt", "D:\New Folder\*.bkp"

移动一个文件夹中所有文件和文件夹到另一个文件夹中.

    ErrorCount := MoveFilesAndFolders("C:\My Folder\*.*", "D:\Folder to receive all files & folders")
    if ErrorCount != 0
        MsgBox ErrorCount " files/folders could not be moved."

    MoveFilesAndFolders(SourcePattern, DestinationFolder, DoOverwrite := false)
    ; 移动匹配 SourcePattern 的所有文件和文件夹到 DestinationFolder 文件夹中且
    ; 返回无法移动的文件/文件夹的数目.
    {
        ErrorCount := 0
        if DoOverwrite = 1
            DoOverwrite := 2  ; 请参阅 DirMove 了解模式 2 与模式 1 的区别.
        ; 首先移动所有文件(不是文件夹):
        try
            FileMove SourcePattern, DestinationFolder, DoOverwrite
        catch as Err
            ErrorCount := Err.Extra
        ; 现在移动所有文件夹:
        Loop Files, SourcePattern, "D"  ; D 表示 "只获取文件夹".
        {
            try
                DirMove A_LoopFilePath, DestinationFolder "\" A_LoopFileName, DoOverwrite
            catch
            {
                ErrorCount += 1
                ; 报告每个出现问题的文件夹名称.
                MsgBox "Could not move " A_LoopFilePath " into " DestinationFolder
            }
        }
        return ErrorCount
    }

dftg