2017-01-02 2 views
2

"file1"、 "file2"という名前のファイルタイプがない5つのファイルでディレクトリが作成されています(おそらくファイルタイプが「.txt」 - 不明です)。すべてのファイルにタイプがない場合、Rubyのファイル名を変更しますか?

私はそれらを次のコードで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 

私が働いているすべてのものが、

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

エラーを投げている行を確認するFをp'dていませんようにファイルまたはディレクトリ...(Errno :: ENOENT) "

これはなぜ動作しないのですか? Dir.foreachによって返さ

答えて

2

あなたはfolder_pathにディレクトリを変更することができますファイル:

あなたは名前の変更は、ファイル名にfolder_pathを付加することで成功させることができます。いくつかのファイルが「.TXT」拡張子を持っている可能性がある場合は、.txt.csvファイルを取得しないようにするために最初の拡張子を削除する必要があります。Pathnameでパス名

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 

を、それは通常フィルタリングする方がはるかに簡単だとファイルの名前を変更:

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

パスを使用すると、渡されたfolder_pathを基準にしています。File.renameへのあなたの呼び出しは、おそらくfolder_pathで指定されたものと同じディレクトリではありません、現在の作業ディレクトリ内のファイルの名前を変更しようとします。監督で

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

1つの代替:

require 'pathname' 

folder.children.each do |child| 
    # Other logic here 
    child.rename(child.dirname + (child.basename.to_s + '.csv')) 
end 
関連する問題