" FileUtils.cp"不正常工作 - 鲁莽

时间:2015-12-07 15:46:55

标签: ruby

我有一个脚本执行以下操作(我的问题在步骤5中):

  1. 以递归方式遍历某些目录,解析xml文件并将结果存储到数组
  2. 创建一个新目录" new_directory"在每个放置xml文件的目录中
  3. 同样如2)但创建文本文件" temp.txt"
  4. 打开temp.txt并将解析结果写入其中。写入" temp.txt"的字符串;是源文件的路径,如下所示:

    ../../Path/to/source/source_a.c
    ../../Path/to/othersource/source_b.c
    
  5. 在最后一步中,我尝试将这些源文件从temp.txt复制到新目录" new_directory"
  6. 代码如下所示:

    #######--STEP 1) 
        xml_files = Dir['TESTS_*/**/*.xml']
        xml_files.each do |file_name|
    
          ##parsing logic is here.... I didn't show it---
    
          $my_array = []
    
    #######--STEP 2) 
          xml_directory = Dir['TESTS_*/*/']
          xml_directory.each do |folder|
            FileUtils.mkdir_p(File.join(folder, 'new_Directory'))
          end
    
    #######--STEP 3) 
          tmp_file = File.expand_path(File.dirname(file_name)) + "/temp.txt"
    
    #######--STEP 4) 
          File.open(tmp_file, 'w') {|f| f.write $my_array.join("\n")}
    
    #######--STEP 5) 
          tmp_file.each_line do |file_name |
            FileUtils.cp(file_name, 'new_Directory')   
          end
        end
    

    一切都很好,但来自" temp.txt"的源文件文件未复制。没有错误。是否可以在步骤3)中创建temp.txt文件?这种创建文件的方式,而不是写入它们,我已经在其他脚本中完成了它的工作。当我打印" p tmp_file"我明白了:

    "C:/Project/TESTS_A/myTestsA/temp.txt"
    "C:/Project/TESTS_B/myTestsB/temp.txt"
    

    知道出了什么问题吗?

2 个答案:

答案 0 :(得分:2)

移动STEP2:

xml_directory = Dir['TESTS_*/*/']
xml_directory.each do |folder|
  FileUtils.mkdir_p(File.join(folder, 'new_Directory'))
end

排在最前面的Dir[...](之前)。原因是Dir#[]更改Dir.pwd并且嵌套时,上面的块只返回空集。因为它正在相对执行到当前目录。

要查看自己发生了什么,请尝试puts Dir.pwd无处不在。

答案 1 :(得分:0)

感谢@mudasobwa:

首先,我在问题中忘记了一行,正好在步骤2中。原来的是:

#######--STEP 2) 
Dir.chdir ../../../../ do
      xml_directory = Dir['TESTS_*/*/']
      xml_directory.each do |folder|
        FileUtils.mkdir_p(File.join(folder, 'new_Directory'))
      end

正如您所看到的,我在错误的地方更改了ruby脚本的工作目录(../../../../),这就是问题所在。所以我应该在步骤5)中更改工作目录,以便代码看起来像:

#######--STEP 5) 
Dir.chdir ../../../../ do      
tmp_file.each_line do |file_name |
        FileUtils.cp(file_name, 'new_Directory')   
      end
    end