复制文件
让我们通过编写一个简单的文件备份程序将 File 类用于实际用途。当你运行 copy_files.rb 时,将要求你选择要从中复制的目录(源目录)和要复制到的另一个目录(目标目录)。假设两个目录都存在,程序将把所有文件从源目录复制到目标目录。如果目标目录不存在,它将询问你是否要创建它(你应该输入,’Y’ 接受)。我已经为你提供了一个源目录;只需在提示时输入名称 srcdir。当询问目标目录时,输入 targetdir 以在当前目录下创建该名称的子目录。
程序使用源目录的路径初始化变量 sourcedir
,并使用目标目录的名称初始化 targetdir
。这是执行文件复制的代码:
Dir.foreach( sourcedir ){
|f|
filepath = "#{sourcedir}\\#{f}"
if !(File.directory?(filepath) ) then
if File.exist?("#{targetdir}\\#{f}") then
puts("#{f} already exists in target directory (not copied)" )
else
FileUtils.cp( filepath, targetdir )
puts("Copying... #{filepath}" )
end
end
}
在这里,我使用了 Dir 类的 foreach
方法,该方法将指定目录中每个文件的文件名传递给块变量 f
。我很快就会说到关于 Dir 类的东西。该代码通过将文件名附加到 sourcedir
变量给出的目录名来构造合适的文件路径 filepath
。我只想复制数据文件而不是目录,所以我测试文件路径是文件而不是目录:
if !(File.directory?(filepath) )
此程序不会复制已存在的文件,因此它首先检查目标目录 targetdir
中是否已存在名称为 f
的文件:
if File.exist?("#{targetdir}\\#{f}")
最后,假设满足所有指定条件,源文件 filepath
将复制到 targetdir
:
FileUtils.cp( filepath, targetdir )
这里的 cp
是 FileUtils 模块中的文件复制方法。该模块还包含许多其它有用的文件处理例程,例如 mv(source,target)
用于将文件从 source
移动到 target
;rm(files)
将删除 files 参数列出的一个或多个文件,mkdir
将创建一个目录,就像我在当前程序中创建 targetdir
时所做的那样:
FileUtils.mkdir( targetdir )