Rubyをはじめとしたプログラム開発において、ファイル操作は頻出処理の1つです。
本記事では、Rubyのファイル操作における基本である「作成」「移動」「コピー」「削除」の方法について、サンプルコードを掲載しながらご紹介していきます。
前記事「【Ruby入門】入力と出力」では、標準入出力やファイルへの出力を解説しているので合わせてご覧ください。
- ファイルの作成には「File.open」を利用
- ファイルの移動には「File.rename」を利用
- ファイルのコピーには「FileUtils.cp」を利用
- ファイルの削除には「FileUtils.rm」を利用
- FileUtilsには他にも便利な機能がたくさん
ファイルの作成
ファイルの作成は、すでに前記事「【Ruby入門】入力と出力」で解説しましたので、おさらいにサラッと見てみましょう。
新規にファイルを作り、その中にabcdeという文字列を書き込みましょう。
File.open("sample1.txt", "w") do |io| io.puts "abcde" end
sample1.txtというファイル名でファイルができ、中身はabcdeという文字列が書き込まれます。
Rubyでプログラミングしてみたいけれど「全くプログラミングの知識もないし不安だ」といった方は、「ポテパンキャンプ」での無料カウンセリングがおすすめです。
ファイルの移動
ファイルを移動してみましょう。
現在の場所から「back」というフォルダに移動してみます。
移動というよりは、Fileクラスのrenameメソッドを使い、移動先のパスを指定するというイメージです。
実際に試す前に、現在のフォルダの中にbackというフォルダを作っておいてください。
File.rename("sample1.txt","back/sample1.txt")
上記を実行後、backというフォルダにファイルが移動されているのがわかります。
実際に実行するときには、以下を守る必要がありますので注意してください。
例えば上記をsample.rbというファイル名で実行する場合です。
- sample.rbと同じフォルダにsample1.txtが存在
- sample.rbと同じフォルダにbackというフォルダが存在
また、ライブラリfileutilsを使っても可能です。
require "fileutils" FileUtils.mv("sample1.txt","back/sample1.txt")
いずれの方法も、同じファイル名で移動しましたが、移動と同時にファイル名を変えることも可能です。
require "fileutils" FileUtils.mv("sample1.txt","back/sample1_1.txt")
こうすれば、移動と同時にファイル名がsample1_1.txtに変更されます。
もうちょっとアレンジして、日付を含んだファイル名でコピーしてみましょう。
require "fileutils" t = Time.now filename = "back/sample1_" + t.strftime("%Y%m%d") + ".txt" FileUtils.cp("sample1.txt",filename)
これで、実行時が2017年11月29日ならば、backというフォルダに「sample1_20171129.txt」というファイル名で移動できます。
ファイル操作以外にもRuby言語を効率的に学べるスクールならこちら
ファイルのコピー
ファイルのコピーも、fileutilsを使います。
require "fileutils" FileUtils.cp("sample1.txt","back/sample1.txt")
ここもちょっと工夫して、同じフォルダに2から10まで連番をつけてファイルをコピーしてみましょう。
require "fileutils" (2..10).each do |i| FileUtils.cp("sample1.txt","sample" + i.to_s + ".txt") end
sample2.txtからsample10.txtが作成されます。
特定のフォルダの中身をすべてコピー
今までの解説は、すべて1本のファイルばかりでした。では特定のフォルダ以下すべてを選択するにはどうすればよいでしょうか?
Dir.globを使うと、指定したフォルダ内のファイル名が、リスト形式で得られます。
以下を実行してみてください。
require "fileutils" puts Dir.glob('*.*')
ソースファイルが存在しているフォルダのファイル名の一覧が表示されたはずです。
フォルダを指定したい場合は、Dir.chdirでカレントディレクトリを変更します。’フォルダ’は、お使いの環境に合わせて変更してください。
require "fileutils" Dir.chdir 'フォルダ' puts Dir.glob('*.*')
*.*で、ファイル名や拡張子ともにワイルドカードを指定していますので、指定したフォルダ以下すべてが対象となっています。
もちろん、ファイル名や拡張子を指定して、対象を絞ることも可能です。
早速、ソースファイルがあるフォルダ内部のファイルをすべてコピーしてみましょう。
require "fileutils" Dir.glob('*.*').each do |filename| FileUtils.cp(filename, "back/" + filename) end
フォルダ内部のファイルがすべて、同一フォルダ内のbackフォルダにコピーされます。
何も考えず、特定のフォルダから別のフォルダにコピーするだけなら、FileUtils.cp_rを使います。
require "fileutils" FileUtils.cp_r(Dir.glob('*.*'), "back/")
これで、ソースファイルの直下のすべてが、backフォルダへとコピーされます。
またfileutilには、cp_rに限らず「_r」がついたコマンドがいくつかあります。これは再帰的という意味を持ちます。
フォルダの中身全部、という意味になります。
便利なので覚えておきましょう。
ファイル操作以外にもRuby言語を効率的に学べるスクールならこちら
ファイルの削除
削除もfileutilsのFileUtils.rmを使います。
まずは基本形です。
FileUtils.rm("sample1.txt")
フォルダ以下すべてを削除
ソースファイルの存在しているフォルダの中身を、すべて削除します。
require "fileutils" Dir.glob('*.*').each do |filename| FileUtils.rm(filename) end
上記をそのまま実行すると、ソースファイルのあるフォルダの中身、つまりソースファイルまで消えるのでご注意ください。
特知恵のフォルダを指定したい場合は、コピーの節で出てきた「Dir.chdir」をDir.globの前で実行してフォルダを変更してください。
Rubyでファイル操作以外のプログラミングもしてみたい、ただ「自分一人で何を開発したら良いのか分からない」といった方は、「ポテパンキャンプ」での無料カウンセリングがおすすめです。
まとめ
本記事では、Rubyでのファイル操作について、基本となるメソッドの使い方から少し応用編にまで触れてご紹介してきました。
今回ご紹介した内容はごく一部であり、FileUtilsを利用すればファイル操作に関するもっと複雑な処理も実現させることが可能です。
Rubyでのファイル操作の基本を抑えて、実現したい処理を効率的に実現出来るよう学習を進めていきましょう。
ファイル操作以外にもRuby言語を効率的に学べるスクールならこちら