当所有文件都没有类型时,在Ruby中更改文件名?

时间:2017-01-02 03:46:48

标签: ruby

我的目录中有5个没有文件类型的文件(也许他们的文件类型是'.txt' - 我不确定),名为“file1”,“file2”......

我正在尝试使用以下代码将它们转换为CSV格式:

require('fileutils')
folder_path = "correct_folder_path"
Dir.foreach(folder_path) do |f|
  next if f == '.' || f == '..'
  #confirm inputs are correct (they are)
  #p f
  #p f+".csv" 
  File.rename(f, f+".csv")
end

我已经确认f确认一切正常,但行

File.rename(f,f+".csv")

抛出错误:“在'重命名'中:没有这样的文件或目录......(Errno :: ENOENT)”

有谁知道为什么这不起作用?

3 个答案:

答案 0 :(得分:2)

Dir.foreach返回的路径相对于您传入的folder_path。您对File.rename的调用尝试重命名当前工作目录中的文件,这可能不是与folder_path指定的目录相同的目录。

您可以通过在文件名前添加folder_path来使重命名成功:

f = File.join(folder_path, f)
File.rename(f, f + ".csv")

答案 1 :(得分:2)

使用Dir和文件

您可以将目录更改为folder_path。如果某些文件可能具有“.txt”扩展名,则需要首先删除扩展名,以便不获取.txt.csv文件:

folder_path = "correct_folder_path"
Dir.chdir(folder_path) do
  Dir.foreach(".") do |f|
    next if File.directory?(f)
    basename = File.basename(f, '.*')
    new_file = basename + '.csv'
    p f
    p new_file
    ## Uncomment when you're sure f and new_file are correct :
    # File.rename(f, new_file) unless f == new_file
  end
end

使用路径名

使用Pathname,过滤和重命名文件通常要容易得多:

require 'pathname'
folder_path = "correct_folder_path"

Pathname.new(folder_path).children.each do |f|
  next if f.directory?
  p f
  p f.sub_ext('.csv')
  ## Uncomment if you're sure f and subext are correct :
  # f.rename(f.sub_ext('.csv'))
end

答案 2 :(得分:1)

另一种选择:

require 'pathname'

folder.children.each do |child|
  # Other logic here
  child.rename(child.dirname + (child.basename.to_s + '.csv'))
end