FileCopy

复制一个或多个文件.

FileCopy SourcePattern, DestPattern , Overwrite

参数

SourcePattern

类型: 字符串

单个文件或文件夹的名称, 或通配符模式(如 "C:\Temp\*.tmp"). 如果未指定绝对路径, 则假定 SourcePatternA_WorkingDir 中.

DestPattern

类型: 字符串

目标的名称或模式, 如果未指定绝对路径, 则假定 SourcePatternA_WorkingDir 中.

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

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

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

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

Overwrite

类型: 整数

如果省略,则默认为 0. 否则, 指定以下数字之一, 以指示是否覆盖已存在的文件:

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

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

错误处理

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

FileMove 不同, 即使在覆盖模式生效的情况下, 复制一个文件来覆盖它自己始终被视为错误.

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

备注

FileCopy 只复制文件. 要复制整个文件夹中的内容(它的所有文件和子文件夹), 请参阅下面的示例部分. 要复制单个文件夹(及其子文件夹), 请使用 DirCopy.

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

FileMove, DirCopy, DirMove, FileDelete

示例

复制文件并保留原来的文件名.

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

复制文件到同一个文件夹并改变文件名.

FileCopy "C:\My File.txt", "C:\My File New.txt"

复制文本文件到新位置并改变扩展名.

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

复制一个文件夹中所有文件和文件夹到另一个文件夹中.

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

CopyFilesAndFolders(SourcePattern, DestinationFolder, DoOverwrite := false)
; 复制匹配 SourcePattern 的所有文件和文件夹到 DestinationFolder 文件夹中且
; 返回无法复制的文件/文件夹的数目.
{
    ErrorCount := 0
    ; 首先复制所有文件(不是文件夹):
    try
        FileCopy SourcePattern, DestinationFolder, DoOverwrite
    catch as Err
        ErrorCount := Err.Extra
    ; 现在复制所有文件夹:
    Loop Files, SourcePattern, "D"  ; D 表示 "只检索文件夹".
    {
        try
            DirCopy A_LoopFilePath, DestinationFolder "\" A_LoopFileName, DoOverwrite
        catch
        {
            ErrorCount += 1
            ; 报告每个出现问题的文件夹名称.
            MsgBox "Could not copy " A_LoopFilePath " into " DestinationFolder
        }
    }
    return ErrorCount
}