【问题标题】:Copying a file to a directory?将文件复制到目录?
【发布时间】:2013-12-29 02:59:35
【问题描述】:

我有一个 Ruby 程序,可以将文件从源文件夹复制到目标文件夹。

C:\srcdir\testfile.txt 是源文件夹,C:\targetdir 是目标文件夹。

程序不断报错:

copy_files.rb:11:in block in <main>': uninitialized constant FileUtils (NameError)

为什么会这样?这是我的代码:

sourcedir = "C:\\srcdir"
targetdir = "C:\\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
}

【问题讨论】:

  • 你正在编写非常单一的 Ruby... 见 pastebin.com/Fz2kHgys
  • 你能给我建议吗?我不明白你:)
  • 请阅读IO documentation的开头; Ruby 可以避免使用反斜杠来定义文件系统中的路径,因此C:\srcdir\testfile.txt 更容易写成C:/srcdir/testfile.txt

标签: ruby


【解决方案1】:

FileUtils 是一个模块,它不是 Ruby 核心的一部分。你需要require它才能使用它,像这样:

require 'fileutils'

这个 stackoverflow 问题解释了如何使用 FileUtils 移动文件:How do I move a file with Ruby?

这是 Ruby 1.9.3 的 FileUtils 模块的文档:http://ruby-doc.org/stdlib-1.9.3/libdoc/fileutils/rdoc/FileUtils.html

【讨论】:

    【解决方案2】:

    这是未经测试的代码,但更接近我的编写方式:

    SOURCEDIR = 'C:/srcdir'
    TARGETDIR = 'C:/targetdir'
    
    Dir.foreach(SOURCEDIR) do |f|
      filepath = File.join(SOURCEDIR, f)
      if !File.directory?(filepath) 
        if File.exist?(File.join(TARGETDIR, f) 
          puts "#{ f } already exists in target directory (not copied)"
        else
          print "Copying #{ filepath }... "
          FileUtils.cp(filepath, TARGETDIR)
          puts "done"
        end
      end
    end
    

    当然,您的操作系统会让它变得更容易;批处理和 shell 文件以及操作系统级别的命令就是为此而制定的。

    【讨论】:

      猜你喜欢
      • 2014-01-03
      • 2012-03-18
      • 2011-11-19
      • 2023-04-02
      • 2017-11-18
      • 2021-06-16
      • 1970-01-01
      • 2014-07-25
      相关资源
      最近更新 更多