File::Copy - 复制文件或文件句柄
use File::Copy;
copy("sourcefile", "destinationfile") or die "Copy failed: $!";
copy("Copy.pm", \*STDOUT);
move("/dev1/sourcefile", "/dev2/destinationfile");
use File::Copy "cp";
my $n = FileHandle->new("/a/file", "r");
cp($n, "x");
File::Copy 模块提供两个基本函数,copy
和 move
,它们对于将文件内容从一个位置获取到另一个位置非常有用。
copy
函数采用两个参数:一个要从中复制的文件和一个要复制到的文件。任一参数都可以是字符串、FileHandle 引用或 FileHandle glob。显然,如果第一个参数是某种文件句柄,则会从中读取,如果它是一个文件名称,则会将其打开以进行读取。同样,第二个参数将被写入。如果第二个参数不存在,但父目录存在,则会创建它。尝试将文件复制到不存在的目录中是一个错误。尝试将文件复制到自身也是一个错误。copy
不会覆盖只读文件。
如果目标(第二个参数)已经存在并且是一个目录,并且源(第一个参数)不是文件句柄,则源文件将被复制到由目标指定的目录中,使用与源文件相同的基本名称。当目标是目录时,将文件句柄作为源是一个失败。
请注意,将文件作为句柄而不是名称传递可能会导致某些操作系统上的信息丢失;建议尽可能使用文件名。文件在适用的情况下以二进制模式打开。要从文件句柄复制到文件时获得一致的行为,请对文件句柄使用 binmode
。
可以使用可选的第三个参数来指定用于复制的缓冲区大小。这是从第一个文件中的字节数,在写入第二个文件之前,将在任何给定时间保存在内存中。默认缓冲区大小取决于文件,但通常是整个文件(最大 2MB),或对于不引用文件的句柄(例如套接字)为 1k。
可以使用语法 use File::Copy "cp"
来获取此函数的 cp
别名。语法完全相同。行为也几乎相同:从版本 2.15 开始,cp
将保留源文件的权限位,就像 shell 实用程序 cp(1)
使用默认选项所做的那样,而 copy
使用目标文件的默认权限(可能取决于进程的 umask
、文件所有权、继承的 ACL 等)。也就是说,如果目标文件已经存在,cp
将保留其权限不变;否则,权限将从源文件获取并由 umask
修改。如果在设置权限时发生错误,cp
将返回 0,无论文件是否成功复制。
move
函数也接受两个参数:要移动的文件的当前名称和预期名称。如果目标已存在并且是目录,并且源不是目录,则源文件将重命名为目标指定的目录中。
如果可能,move() 将简单地重命名文件。否则,它将文件复制到新位置并删除原始文件。如果在此复制和删除过程中发生错误,您可能会在目标名称下留下一个(可能是部分)文件副本。
您可以像使用 cp
别名一样使用此函数的 mv
别名。
File::Copy 还提供了 syscopy
例程,它将第一个参数中指定的文件复制到第二个参数中指定的文件,保留特定于操作系统的属性和文件结构。对于 Unix 系统,这等效于简单的 copy
例程,它不保留特定于操作系统的属性。对于 VMS 系统,这将调用 rmscopy
例程(见下文)。对于 OS/2 系统,这将直接调用 syscopy
XSUB。对于 Win32 系统,这将调用 Win32::CopyFile
。
如果定义了 syscopy
(OS/2、VMS 和 Win32)的特殊行为:
如果 copy
的两个参数都不是文件句柄,那么 copy
将对输入文件执行“系统复制”到新的输出文件,以保留文件属性、索引文件结构等。缓冲区大小参数将被忽略。如果 copy
的任何一个参数都是打开文件的句柄,那么将使用 Perl 运算符复制数据,并且不会尝试保留文件属性或记录结构。
系统复制例程也可以在 VMS 和 OS/2 下直接调用为 File::Copy::syscopy
(或在 VMS 下为 File::Copy::rmscopy
,这是为 syscopy 执行实际工作的例程)。
第一个和第二个参数可以是字符串、类型全局变量、类型全局变量引用或从 IO::Handle 继承的对象;它们在所有情况下都用于获取输入和输出文件的文件规范。如果需要,输入文件的名称和类型用作输出文件的默认值。
总是创建输出文件的新版本,它继承输入文件的结构和 RMS 属性,但所有者和保护(以及可能的时间戳;见下文)除外。输入文件中的所有数据都复制到输出文件;如果 rmscopy
的前两个参数中的任何一个是文件句柄,则其位置保持不变。(请注意,这意味着指向输出文件的文件句柄将在 rmscopy
返回后与该文件的旧版本关联,而不是新创建的版本。)
第三个参数是一个整数标志,它告诉 rmscopy
如何处理时间戳。如果它小于 0,则输入文件的时间戳都不会传播到输出文件。如果它大于 0,则将其解释为位掩码:如果设置了位 0(LSB),则传播除修订日期之外的时间戳;如果设置了位 1,则传播修订日期。如果 rmscopy
的第三个参数为 0,则其行为与 DCL COPY 命令非常相似:如果显式指定了输出文件的名称或类型,则不传播时间戳,但如果它们是从输入文件规范中隐式获取的,则传播除修订日期之外的所有时间戳。如果未提供此参数,则默认为 0。
rmscopy
是 VMS 特定的,不能导出;它必须通过其全名引用,例如
File::Copy::rmscopy($from, $to) or die $!;
与 copy
一样,rmscopy
在成功时返回 1。如果发生错误,它将设置 $!
,删除输出文件,并返回 0。
所有函数在成功时返回 1,在失败时返回 0。如果遇到错误,将设置 $!。
在对文件句柄调用 copy() 或 move() 之前,调用者应关闭或刷新文件以避免丢失写入。请注意,即使对于 move() 也是如此,因为根据特定于操作系统的实现和底层文件系统,它实际上可能会复制文件。
File::Copy 由 Aaron Sherman <[email protected]> 于 1995 年编写,并由 Charles Bailey <[email protected]> 于 1996 年更新。