复制文件

让我们通过编写一个简单的文件备份程序将 File 类用于实际用途。当你运行 copy_files.rb 时,将要求你选择要从中复制的目录(源目录)和要复制到的另一个目录(目标目录)。假设两个目录都存在,程序将把所有文件从源目录复制到目标目录。如果目标目录不存在,它将询问你是否要创建它(你应该输入,’Y’ 接受)。我已经为你提供了一个源目录;只需在提示时输入名称 srcdir。当询问目标目录时,输入 targetdir 以在当前目录下创建该名称的子目录。

程序使用源目录的路径初始化变量 sourcedir,并使用目标目录的名称初始化 targetdir。这是执行文件复制的代码:

copy_files.rb
  1. Dir.foreach( sourcedir ){
  2. |f|
  3. filepath = "#{sourcedir}\\#{f}"
  4. if !(File.directory?(filepath) ) then
  5. if File.exist?("#{targetdir}\\#{f}") then
  6. puts("#{f} already exists in target directory (not copied)" )
  7. else
  8. FileUtils.cp( filepath, targetdir )
  9. puts("Copying... #{filepath}" )
  10. end
  11. end
  12. }

在这里,我使用了 Dir 类的 foreach 方法,该方法将指定目录中每个文件的文件名传递给块变量 f。我很快就会说到关于 Dir 类的东西。该代码通过将文件名附加到 sourcedir 变量给出的目录名来构造合适的文件路径 filepath。我只想复制数据文件而不是目录,所以我测试文件路径是文件而不是目录:

  1. if !(File.directory?(filepath) )

此程序不会复制已存在的文件,因此它首先检查目标目录 targetdir 中是否已存在名称为 f 的文件:

  1. if File.exist?("#{targetdir}\\#{f}")

最后,假设满足所有指定条件,源文件 filepath 将复制到 targetdir

  1. FileUtils.cp( filepath, targetdir )

这里的 cp 是 FileUtils 模块中的文件复制方法。该模块还包含许多其它有用的文件处理例程,例如 mv(source,target) 用于将文件从 source 移动到 targetrm(files) 将删除 files 参数列出的一个或多个文件,mkdir 将创建一个目录,就像我在当前程序中创建 targetdir 时所做的那样:

  1. FileUtils.mkdir( targetdir )